因业务需要,现要把后台的Json字符串转换为文件,且格式要有层次感,且便于阅读。网上有些方案是根据符号来进行缩进换行,奈何本人推崇简洁(懒)。后在此篇https://www.cnblogs.com/liujiale/p/10937574.html,寻得灵感,效果不错,特此分享。
//json字符串
String json = "{\"code\": 200, \"success\": true,\"data\": [{\"key\":\"111\"},{\"key\":\"222\"}]}";
//将其包装为html
StringBuilder sb = new StringBuilder();
sb.append("<!DOCTYPE html><html lang=\"en\">")
.append("<head><meta charset=\"UTF-8\"></head>")
.append("<body><pre id=\"data\"></pre>")
.append("<script type=\"text/javascript\">")
.append("var text ='").append(json).append("';")
.append("document.getElementById('data').innerText= JSON.stringify(JSON.parse(text), null, 2);")
.append("</script></body></html>");
//导出到文件中
File file = new File("D:/json.html");
try {
file.createNewFile();
FileWriter writer = new FileWriter(file);
writer.write(sb.toString());
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
生成的文件中HTML代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
</head>
<body>
<pre id="data"></pre>
<script type="text/javascript">
var text ='{"code": 200, "success": true,"data": [{"key":"111"},{"key":"222"}]}';
document.getElementById('data').innerText= JSON.stringify(JSON.parse(text), null, 2);
</script>
</body>
</html>
效果如下图:
附上另一种方法,不管是输出到控制台还是输出到文件,都是格式化的文件。
参考地址:Json字符串控制台格式化输出java
private String responseFormat(String json){
StringBuffer jsonStr = new StringBuffer();
int level = 0;
for(int index = 0, len = json.length(); index < len; index++) {//将字符串中的字符逐个按行输出
//获取s中的每个字符
char c = json.charAt(index);
//level大于0并且jsonForMatStr中的最后一个字符为\n,jsonForMatStr加入\t
if (level > 0 && '\n' == jsonStr.charAt(jsonStr.length() - 1)) {
jsonStr.append(getLevelStr(level));
}
//遇到"{"和"["要增加空格和换行,遇到"}"和"]"要减少空格,遇到","要换行
switch (c) {
case '{':
case '[':
jsonStr.append(c + "\n");
level++;
break;
case ',':
jsonStr.append(c + "\n");
break;
case '}':
case ']':
jsonStr.append("\n");
level--;
jsonStr.append(getLevelStr(level));
jsonStr.append(c);
break;
default:
jsonStr.append(c);
break;
}
}
return jsonStr.toString();
}
private String getLevelStr(int level) {
StringBuffer levelStr = new StringBuffer();
for (int levelI = 0; levelI < level; levelI++) {
levelStr.append("\t");
}
return levelStr.toString();
}