C# 格式化JSON字符串(缩进对齐),不用第三方lib

Antecer 2015-05-19 11:29:06
这几天都在和JSON做斗争,又不想加入第三方lib,于是出现了如下产物:
需引用命名空间
using System;
using System.Collections.Generic;
using System.Web.Script.Serialization;

public static string DictionaryToJson(Dictionary<string, object> dictionary)
{
JavaScriptSerializer jss = new JavaScriptSerializer();
try
{
String Tjson = jss.Serialize(dictionary);
Tjson = Tjson.Replace("[{", "[\r{").Replace("}]", "}\r]").Replace("{\"", "{\r\"").Replace("}", "\r}");
Tjson = Tjson.Replace("\",", "\",\r").Replace("},", "},\r").Replace("],", "],\r");
String linesign = "";
for (int n = 0; n < Tjson.Length; n++)
{
if (Tjson[n] == '\r' && Tjson[n - 1] == '{') linesign = linesign + " ";
else if (Tjson[n] == '\r' && Tjson[n - 1] == '[') linesign = linesign + " ";
else if (Tjson[n] == '\r' && Tjson[n + 1] == ']') linesign = linesign.Remove(0, 4);
else if (Tjson[n] == '\r' && Tjson[n + 1] == '}') linesign = linesign.Remove(0, 4);
if (Tjson[n] == '\r')
{
Tjson = Tjson.Insert(n + 1, "\n" + linesign);
n = n + linesign.Length + 1;
}
}
return Tjson;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}


目前自用,暂未发现什么问题,只是效率有点低下。若有问题,欢迎指出
...全文
1135 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Antecer 2015-05-28
  • 打赏
  • 举报
回复
引用 8 楼 xuzuning 的回复:
只是如果数据中本身存在 [{、}] 之类的字符组合的话,楼主该怎么办呢
还是你明白了我的意思啊,关于数据中本身存在[{、}] 这种东西的确是一个问题,常规使用都碰不到这种情况,于是疏忽了。
xuzuning 2015-05-21
  • 打赏
  • 举报
回复
只是如果数据中本身存在 [{、}] 之类的字符组合的话,楼主该怎么办呢
xuzuning 2015-05-21
  • 打赏
  • 举报
回复
楼主不过是对 JavaScriptSerializer.Serialize 方法的结果(一个紧凑的格式)进行展开而已 至于遭到那么多的非议吗?
  • 打赏
  • 举报
回复
一个格式化输出,是建立在(至少)创建了语法树的基础上的。不应该随便弄点简单的字符串替换。 随便处理比如说这样一个json内容 { "_t": "任务 CanDo 检测失败", "task": { "Id": "554f798798428c24041df7b2", "CreateTime": "2015-05-10T23:30:15.2944889+08:00", "CommandType": "Federal.WebPush", "Data": { “Message": "房间排队更新!\", "PassportId": "ab6dd1cf5f844ee0add7297b5c24d1b6\" }, "SaveResultMinutes": 5, "ReceiverIds": [ "b85e28d6577e46e182bdf34041588616" ], "SenderId": "b85e28d6577e46e182bdf34041588616", "Expire": "2015-05-13T23:30:15.2944889+08:00", "ResultType": null, "Result": "--[{失败}]", "CompletedTime": "0001-01-01T00:00:00", } } 你试试可以格式化成功吗?
skyandcode 2015-05-20
  • 打赏
  • 举报
回复
newtonsoft已经做得很好了,自己学习还行,实际最好不要这么搞。 1. for 写成 (int n = 0,len = Tjson.Length; n < len; n++) 2.你应该判断字符串的长度,如果长度大于某个值,就不用“+” ,而用 StringBuilder 了。
  • 打赏
  • 举报
回复
比如说你貌似处理了 [{,但是如果这两个符号中间有一个空格、两个空格....n个空格、一个\t、两个\t......n个\t、一个\r、......\一个\r\n.......等等500种可能性,你处理了吗?仅仅这一个符号你就没有处理,何况其它几百个符号呢?那么你的程序在逻辑上就是无法pk任何一个比较简单的json解析类库的。 这类东西,一看就知道,需要有“词法分析、语法分析”等基础知识,也就是有《编译技术原理》课程的最初步的知识。不是学点《c#语言》课程的那个范畴的。所以这类非常流行的东西,如果觉得许多同学都感觉它时髦,但是也不一定是和自己去开发。反而是把精力放到别人可能一两年根本想不到要开发的框架上,然后突然把成熟的框架拿出来了,才有意思。
  • 打赏
  • 举报
回复
你是想写一个json类库来 pk 掉 Newtonsoft.Json 吧? 搞研究也是受欢迎的。只要你是免费给人做研究,别花太多工资就好。.
Antecer 2015-05-20
  • 打赏
  • 举报
回复
引用 1 楼 devmiao 的回复:
那就只能自己匹配空格缩进了,需要一个堆栈
我已经匹配好了,暂时使用没发现什么问题,就是发出来看看有没有效率更高的办法。
devmiao 2015-05-19
  • 打赏
  • 举报
回复
那就只能自己匹配空格缩进了,需要一个堆栈

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧