算法
使用算法如下:
对输入字符串,逐个字符的遍历
1、获取当前字符。
2、如果当前字符是前方括号、前花括号做如下处理:
- 如果前面还有字符,并且字符为“:”,打印:换行和缩进字符字符串。
- 打印:当前字符。
- 前方括号、前花括号,的后面必须换行。打印:换行。
- 每出现一次前方括号、前花括号;缩进次数增加一次。打印:新行缩进。
- 进行下一次循环。
3、如果当前字符是后方括号、后花括号做如下处理:
- 后方括号、后花括号,的前面必须换行。打印:换行。
- 每出现一次后方括号、后花括号;缩进次数减少一次。打印:缩进。
- 打印:当前字符。
- 如果当前字符后面还有字符,并且字符不为“,”,打印:换行。
- 继续下一次循环。
4、如果当前字符是逗号。逗号后面换行,并缩进,不改变缩进次数。
- 这里有bug,更改为【并且当前字符后方是双引号或左大括号】
5、打印:当前字符。
代码
package com.bqt.http.utils;
public class JsonFormatTool {
//单位缩进字符串。
private static String SPACE = " ";
/**
* 返回格式化JSON字符串。
@param
@return
*/
public static
new
int
int
char
//遍历输入字符串。
for (int
//1、获取当前字符。
key = json.charAt(i);
//2、如果当前字符是前方括号、前花括号做如下处理:
if ((key == '[') || (key == '{')) {
//(1)如果前面还有字符,并且字符为“:”,打印:换行和缩进字符字符串。
if ((i - 1 > 0) && (json.charAt(i - 1) == ':')) {
'\n');
indent(number));
}
//(2)打印:当前字符。
result.append(key);
//(3)前方括号、前花括号,的后面必须换行。打印:换行。
'\n');
//(4)每出现一次前方括号、前花括号;缩进次数增加一次。打印:新行缩进。
number++;
indent(number));
//(5)进行下一次循环。
continue;
}
//3、如果当前字符是后方括号、后花括号做如下处理:
if ((key == ']') || (key == '}')) {
//(1)后方括号、后花括号,的前面必须换行。打印:换行。
'\n');
//(2)每出现一次后方括号、后花括号;缩进次数减少一次。打印:缩进。
number--;
indent(number));
//(3)打印:当前字符。
result.append(key);
//(4)如果当前字符后面还有字符,并且字符不为“,”,打印:换行。
if (((i + 1) < length) && (json.charAt(i + 1) != ',')) {
'\n');
}
//(5)继续下一次循环。
continue;
}
//4、如果当前字符是逗号。逗号后面换行,并缩进,不改变缩进次数。
//这里有bug,更改为【并且当前字符后方是双引号或左大括号】************************************************************************************
if ((key == ',') && (json.charAt(i + 1) == '"' || (json.charAt(i + 1) == '{'))) {
result.append(key);
'\n');
indent(number));
continue;
}
//5、打印:当前字符。
result.append(key);
}
return
}
/**
* 返回指定次数的缩进字符串。每一次缩进三个空格,即SPACE。
@param
@return
*/
private static String indent(int
new
for (int
SPACE);
}
return
}
}
其他参考代码
package com.bqt.http.utils;
import java.util.ArrayList;
public class FormatJSONStr {
/**
* 得到格式化json数据 退格用\t 换行用\r
*/
public static
int
new
for (int
char
if (level > 0 && '\n'
getLevelStr(level));
}
switch
case '{':
case '[':
"\n");
level++;
break;
case ',':
"\n");
break;
case '}':
case ']':
"\n");
level--;
getLevelStr(level));
jsonForMatStr.append(c);
break;
default:
jsonForMatStr.append(c);
break;
}
}
return
}
private static String getLevelStr(int
new
for (int
"\t");
}
return
}
//**************************************************************************************************************************
/**
* json字符串的格式化
@param
@param
@return
*/
public static
if (json == null
return null;
}
int
new
{
String jsonTemp = json;
//预读取
while
getToken(jsonTemp);
jsonTemp = jsonTemp.substring(token.length());
token = token.trim();
tokenList.add(token);
}
}
for (int
String token = tokenList.get(i);
int length = token.getBytes().length;
if (length > fixedLenth && i < tokenList.size() - 1 && tokenList.get(i + 1).equals(":")) {
fixedLenth = length;
}
}
new
int
for (int
String token = tokenList.get(i);
if (token.equals(",")) {
buf.append(token);
doFill(buf, count, fillStringUnit);
continue;
}
if (token.equals(":")) {
" ").append(token).append(" ");
continue;
}
if (token.equals("{")) {
String nextToken = tokenList.get(i + 1);
if (nextToken.equals("}")) {
i++;
"{ }");
else
count++;
buf.append(token);
doFill(buf, count, fillStringUnit);
}
continue;
}
if (token.equals("}")) {
count--;
doFill(buf, count, fillStringUnit);
buf.append(token);
continue;
}
if (token.equals("[")) {
String nextToken = tokenList.get(i + 1);
if (nextToken.equals("]")) {
i++;
"[ ]");
else
count++;
buf.append(token);
doFill(buf, count, fillStringUnit);
}
continue;
}
if (token.equals("]")) {
count--;
doFill(buf, count, fillStringUnit);
buf.append(token);
continue;
}
buf.append(token);
//左对齐
if (i < tokenList.size() - 1 && tokenList.get(i + 1).equals(":")) {
int fillLength = fixedLenth - token.getBytes().length;
if
for (int
" ");
}
}
}
}
return
}
private static
new
boolean isInYinHao = false;
while
String token = json.substring(0, 1);
json = json.substring(1);
if
":") || token.equals("{") || token.equals("}") || token.equals("[") || token.equals("]") || token.equals(","))) {
if
buf.append(token);
}
break;
}
if (token.equals("\\")) {
buf.append(token);
buf.append(json.substring(0, 1));
json = json.substring(1);
continue;
}
if (token.equals("\"")) {
buf.append(token);
if
break;
else
true;
continue;
}
}
buf.append(token);
}
return
}
private static void doFill(StringBuilder buf, int
"\n");
for (int
buf.append(fillStringUnit);
}
}
}