您的位置:首页 > 编程语言 > Java开发

java实现Json格式美化

2017-12-06 13:56 316 查看
package com.json;

/**
* 该类提供格式化JSON字符串的方法。
* 该类的方法formatJson将JSON字符串格式化,方便查看JSON数据。
* <p>例如:
* </p><p>JSON字符串:["yht","xzj","zwy"]
* </p><p>格式化为:
* </p><p>[
* </p><p>     "yht",
* </p><p>     "xzj",
* </p><p>     "zwy"
* </p><p>]
*
* </p><p>使用算法如下:
* </p><p>对输入字符串,追个字符的遍历
* </p><p>1、获取当前字符。
* </p><p>2、如果当前字符是前方括号、前花括号做如下处理:
* </p><p>(1)如果前面还有字符,并且字符为“:”,打印:换行和缩进字符字符串。
* </p><p>(2)打印:当前字符。
* </p><p>(3)前方括号、前花括号,的后面必须换行。打印:换行。
* </p><p>(4)每出现一次前方括号、前花括号;缩进次数增加一次。打印:新行缩进。
* </p><p>(5)进行下一次循环。
* </p><p>3、如果当前字符是后方括号、后花括号做如下处理:
* </p><p>(1)后方括号、后花括号,的前面必须换行。打印:换行。
* </p><p>(2)每出现一次后方括号、后花括号;缩进次数减少一次。打印:缩进。
* </p><p>(3)打印:当前字符。
* </p><p>(4)如果当前字符后面还有字符,并且字符不为“,”,打印:换行。
* </p><p>(5)继续下一次循环。
* </p><p>4、如果当前字符是逗号。逗号后面换行,并缩进,不改变缩进次数。
* </p><p>5、打印:当前字符。
*
*/
public class JsonFormatTool
{
/**
* 单位缩进字符串。
*/
private static String SPACE = "   ";

/**
* 返回格式化JSON字符串。
*
* @param json 未格式化的JSON字符串。
* @return 格式化的JSON字符串。
*/
public String formatJson(String json)
{
StringBuffer result = new StringBuffer();

int length = json.length();
int number = 0;
char key = 0;
//遍历输入字符串。
for (int i = 0; i < length; i++)
{
//1、获取当前字符。
key = json.charAt(i);

//2、如果当前字符是前方括号、前花括号做如下处理:
if((key == '[') || (key == '{') )
{
//(1)如果前面还有字符,并且字符为“:”,打印:换行和缩进字符字符串。
if((i - 1 > 0) && (json.charAt(i - 1) == ':'))
{
result.append('\n');
result.append(indent(number));
}

//(2)打印:当前字符。
result.append(key);

//(3)前方括号、前花括号,的后面必须换行。打印:换行。
result.append('\n');

//(4)每出现一次前方括号、前花括号;缩进次数增加一次。打印:新行缩进。
number++;
result.append(indent(number));

//(5)进行下一次循环。
continue;
}

//3、如果当前字符是后方括号、后花括号做如下处理:
if((key == ']') || (key == '}') )
{
//(1)后方括号、后花括号,的前面必须换行。打印:换行。
result.append('\n');

//(2)每出现一次后方括号、后花括号;缩进次数减少一次。打印:缩进。
number--;
result.append(indent(number));

//(3)打印:当前字符。
result.append(key);

//(4)如果当前字符后面还有字符,并且字符不为“,”,打印:换行。
if(((i + 1) < length) && (json.charAt(i + 1) != ','))
{
result.append('\n');
}

//(5)继续下一次循环。
continue;
}

//4、如果当前字符是逗号。逗号后面换行,并缩进,不改变缩进次数。
if((key == ','))
{
result.append(key);
result.append('\n');
result.append(indent(number));
continue;
}

//5、打印:当前字符。
result.append(key);
}

return result.toString();
}

/**
* 返回指定次数的缩进字符串。每一次缩进三个空格,即SPACE。
*
* @param number 缩进次数。
* @return 指定缩进次数的字符串。
*/
private String indent(int number)
{
StringBuffer result = new StringBuffer();
for(int i = 0; i < number; i++)
{
result.append(SPACE);
}
return result.toString();
}

public static void main(String[] args) {
JsonFormatTool json = new JsonFormatTool();
String str = "{'age':23,'aihao':['pashan','movies'],'name':{'firstName':'zhang','lastName':'san','aihao':['pashan','movies','name':{'firstName':'zhang','lastName':'san','aihao':['pashan','movies']}]}}";
String result = json.formatJson(str);

System.out.println(result);

}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147

运行输出结果
{
'age':23,
'aihao':
[
'pashan',
'movies'
],
'name':
{
'firstName':'zhang',
'lastName':'san',
'aihao':
[
'pashan',
'movies',
'name':
{
'firstName':'zhang',
'lastName':'san',
'aihao':
[
'pashan',
'movies'
]

}

]

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  json