JSON格式化源代码

  1 public class StringWalker
  2     {
  3         private readonly string _s;
  4
  5         public int Index { get; private set; }
  6         public bool IsEscaped { get; private set; }
  7         public char CurrentChar { get; private set; }
  8
  9         public StringWalker(string s)
 10         {
 11             _s = s;
 12             this.Index = -1;
 13         }
 14
 15         public bool MoveNext()
 16         {
 17             if (this.Index == _s.Length - 1)
 18                 return false;
 19
 20             if (IsEscaped == false)
 21                 IsEscaped = CurrentChar == ‘\\‘;
 22             else
 23                 IsEscaped = false;
 24             this.Index++;
 25             CurrentChar = _s[Index];
 26             return true;
 27         }
 28     };
 29
 30     public class IndentWriter
 31     {
 32         private readonly StringBuilder _result = new StringBuilder();
 33         private int _indentLevel;
 34
 35         public void Indent()
 36         {
 37             _indentLevel++;
 38         }
 39
 40         public void UnIndent()
 41         {
 42             if (_indentLevel > 0)
 43                 _indentLevel--;
 44         }
 45
 46         public void WriteLine(string line)
 47         {
 48             _result.AppendLine(CreateIndent() + line);
 49         }
 50
 51         private string CreateIndent()
 52         {
 53             StringBuilder indent = new StringBuilder();
 54             for (int i = 0; i < _indentLevel; i++)
 55                 indent.Append("    ");
 56             return indent.ToString();
 57         }
 58
 59         public override string ToString()
 60         {
 61             return _result.ToString();
 62         }
 63     };
 64
 65
 66
 67     public class JsonFormatter
 68     {
 69         private readonly StringWalker _walker;
 70         private readonly IndentWriter _writer = new IndentWriter();
 71         private readonly StringBuilder _currentLine = new StringBuilder();
 72         private bool _quoted;
 73
 74         public JsonFormatter(string json)
 75         {
 76             _walker = new StringWalker(json);
 77             ResetLine();
 78         }
 79
 80         public void ResetLine()
 81         {
 82             _currentLine.Length = 0;
 83         }
 84
 85         public string Format()
 86         {
 87             while (MoveNextChar())
 88             {
 89                 if (this._quoted == false && this.IsOpenBracket())
 90                 {
 91                     this.WriteCurrentLine();
 92                     this.AddCharToLine();
 93                     this.WriteCurrentLine();
 94                     _writer.Indent();
 95                 }
 96                 else if (this._quoted == false && this.IsCloseBracket())
 97                 {
 98                     this.WriteCurrentLine();
 99                     _writer.UnIndent();
100                     this.AddCharToLine();
101                 }
102                 else if (this._quoted == false && this.IsColon())
103                 {
104                     this.AddCharToLine();
105                     this.WriteCurrentLine();
106                 }
107                 else
108                 {
109                     AddCharToLine();
110                 }
111             }
112             this.WriteCurrentLine();
113             return _writer.ToString();
114         }
115
116         private bool MoveNextChar()
117         {
118             bool success = _walker.MoveNext();
119             if (this.IsApostrophe())
120             {
121                 this._quoted = !_quoted;
122             }
123             return success;
124         }
125
126         public bool IsApostrophe()
127         {
128             return this._walker.CurrentChar == ‘"‘ && this._walker.IsEscaped == false;
129         }
130
131         public bool IsOpenBracket()
132         {
133             return this._walker.CurrentChar == ‘{‘
134                 || this._walker.CurrentChar == ‘[‘;
135         }
136
137         public bool IsCloseBracket()
138         {
139             return this._walker.CurrentChar == ‘}‘
140                 || this._walker.CurrentChar == ‘]‘;
141         }
142
143         public bool IsColon()
144         {
145             return this._walker.CurrentChar == ‘,‘;
146         }
147
148         private void AddCharToLine()
149         {
150             this._currentLine.Append(_walker.CurrentChar);
151         }
152
153         private void WriteCurrentLine()
154         {
155             string line = this._currentLine.ToString().Trim();
156             if (line.Length > 0)
157             {
158                 _writer.WriteLine(line);
159             }
160             this.ResetLine();
161         }
162     };

测试代码:

1 Console.WriteLine(new JsonFormatter(
2     @"{""parameter"" : ""value"" , { ""parameter2"" : ""value2"" },{ ""parameter3"" : ""value3"" } }").Format());
3 Console.WriteLine(new JsonFormatter(
4     @"{""parameter"":[""value1"",""value2"",""value3""] }").Format());
5 Console.WriteLine(new JsonFormatter(
6     @"{""parameter"": ""value with {brackets}"" }").Format());
7 Console.WriteLine(new JsonFormatter(
8     @"{ ""hello"" : ""value with quotes \""{brackets} and back slash: \\"" }").Format());

运行结果:

 1 {
 2     "parameter" : "value" ,
 3     {
 4         "parameter2" : "value2"
 5     },
 6     {
 7         "parameter3" : "value3"
 8     }
 9 }
10
11 {
12     "parameter":
13     [
14         "value1",
15         "value2",
16         "value3"
17     ]
18 }
19
20 {
21     "parameter": "value with {brackets}"
22 }
23
24 {
25     "hello" : "value with quotes \"{brackets} and back slash: \\"
26 }
时间: 2025-01-16 23:38:44

JSON格式化源代码的相关文章

JSON格式化着色小工具

在我们系统开发过程中越来越多的使用JSON作为数据交换的载体.JSON的特点是层次结构简洁清晰,易于人阅读和编写.同时也易于机器解析和生成.对于机器解析和生成这点本人表示认可,然而对于易于人阅读和编写可以通过下面一段JSON字符串来验证下: {"strValue":"here is str value","nullValue":null,"intvalue":999,"doublevalue":999,&q

json格式化和查看工具

以前一直以来都觉得xml个可读性要比json的可读性好,后来使用了JSON Viewer这个小工具之后,发现自己错了.之前认为json的可读性差,完全是因为没有很好的查看工具.JSON Viewer这个小工具可以很方便的查看json数据. 点击Format可以方便的将凌乱的json格式化. 如果json格式不正确,能够得到很好的提示. 方便的查看键值对. 对数据内容进行查询.

校验字符串是否是JSON格式,将不规则展示的json格式的字符串进行规则展示(json格式化)

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] [html] view plain copy var str = {"code": "","svcname": "","version": "","component": "","category": "","requestMs

Firefox火狐 浏览器接口调试工具 JSON 格式化

作为一名“IT界”的淫才,还是主攻Web端的淫才,相信大家经常会联调各种接口! 如今APP猖狂的年代接口联调更为频繁,当然我们常用于Firefox火狐 浏览器,所以这里主要讲Firefox火狐 浏览器JSON 格式化问题 先前我们拿到的JSON 数据习惯性Copy 到在线JSON 格式去格式化,更加简洁查看各种信息 http://www.bejson.com/jsonviewernew/ 如果我们长期使用的是火狐浏览器长期使用这玩意那就太Low了 下面介绍个JSON 格式化工具 JSON-han

浏览器json格式化插件 yformater

本人最近做的工作就是写interface,几个前端写前端,他们需要什么样的数据格式,我就得返回这样的数据格式.这就导致每一个接口都得检查json格式是否是他们所需要的.但浏览器直接请求的json格式很乱,不方便检查.于是就在网上查找浏览器格式化的方法.结果还真有,下面我就具体说说. 插件下载方法: 一.谷歌浏览器应用商店下载. 地址:https://chrome.google.com/webstore/search/yformater?hl=zh-CN 但是这种方法有个局限性,就是没有墙的兄弟姐

Asp.net WebAPi gzip压缩和json格式化

现在webapi越来越流行了,很多时候它都用来做接口返回json格式的数据,webapi原本是根据客户端的类型动态序列化为json和xml的,但实际很多时候我们都是序列化为json的,所以webapi的序列化比我们用ServiceStack.Text序列化要多花费一些时间,还有如果返回的数据量比较大那么我们应该启动gzip和deflate压缩.而这些实现都不得影响现有的code, 我个人喜欢同时也是习惯用特性来完成压缩和json格式化. 1.压缩的code: namespace MvcApp {

【转】Popclip的JSON格式化扩展

http://liuyunclouder.github.io/2016/09/29/JSONizer:Popclip的JSON格式化扩展 作为一个MAC党,不好好利用MAC的神兵利器,简直就是罪过.Alfred.Dash.Ulysses.SnippetsLib.Mindnode等大名鼎鼎的效率神器自然不用提了,Popclip更是一个每天都会使用上百遍的好帮手. Popclip? 简单来说,Popclip就是一个对选中的内容作快速处理的工具,比如直接搜索选中的内容.从选中的内容生成二维码.计算选中

PHP Json格式化时间处理

/* * 格式化Json时间 Dx -add * date='/Date(1464883200000)/' * PHP的时间戳是10位的.而json格式化后的时间戳是13位的.0补位. */ function renderTime($date) { $dates=str_replace("/Date(", "",$date); $dates=str_replace(")/", "", $dates); $newdate=sub

【转】json格式化、高亮库jsonFormater

http://leo108.com/pid-1996.asp JsonFormater 基于jQuery的json格式化.高亮库 核心代码参考天马行空工作室,本人只做了模块化和一些代码优化. demo http://leo108.github.io/jsonFormater/ github地址 https://github.com/leo108/jsonFormater 使用方式 引入jQuery 1 <script type="text/javascript" src=&quo