Java的Json對象轉字符串如果不格式化非常難看,這裏寫了一個格式化方法。
Json字符串:
{a:123,b:456,c:{d:789,e:101},f:102,g:{}}
Json字符串格式化之後:
{
a:123,
b:456,
c:
{
d:789,
e:101
}
,
f:102,
g:
{
}
}
public class Test {
public static void main(String[] args) {
String json = "{a:123,b:456,c:{d:789,e:101},f:102,g:{}}";
System.out.println(formateJson(json));
}
/**
* 不支持值裏面帶有這5個符號:,{}[]
*/
private static String formateJson(String json) {
if (json.charAt(0) != '{' || json.charAt(json.length() - 1) != '}') {
throw new RuntimeException("兄弟別搞事啊,json字符串可是以\"{\"開頭且以\"}\"結尾,你傳進來的可不是這樣!");
}
int pidx = 0;// {}[]上一個位置
int idx = 0;// {}[]當前位置
String padding = " ";
String linePadding = "";
StringBuilder sb = new StringBuilder();
while (true) {
idx = getIdx(json, pidx);
if (idx < 0) {// 從上一個位置後沒有找到{}[]
sb.append(json.substring(pidx, json.length()));
break;
}
String nextLinePadding = linePadding;
if (isOpen(json, pidx) && isOpen(json, idx)) {
linePadding += padding;
nextLinePadding = linePadding;
} else if (isOpen(json, pidx) && isEnd(json, idx)) {
nextLinePadding = linePadding;
linePadding += padding;
} else if (isEnd(json, pidx) && isOpen(json, idx)) {
if (linePadding.length() >= padding.length()) {
linePadding = linePadding.substring(0, linePadding.length() - padding.length());
}
nextLinePadding = linePadding;
} else if (isEnd(json, pidx) && isEnd(json, idx)) {
if (linePadding.length() >= padding.length()) {
linePadding = linePadding.substring(0, linePadding.length() - padding.length());
}
if (linePadding.length() >= padding.length()) {
nextLinePadding = linePadding.substring(0, linePadding.length() - padding.length());
}
}
if (pidx + 1 < idx) {
String content = json.substring(pidx + 1, idx);
if (!",".equals(content)) {
content = content.replaceAll(",", ",\r\n" + linePadding);
}
sb.append(json.substring(pidx, pidx + 1) + "\r\n" + linePadding + content + "\r\n" + nextLinePadding);
} else {
sb.append(json.substring(pidx, pidx + 1) + "\r\n" + nextLinePadding);
}
pidx = idx;
}
return sb.toString();
}
public static int getIdx(String json, int fromIndex) {
char[] chars = new char[]{'{', '}', '[', ']'};
int idx = -1;
for (int i = 0; i < chars.length; i++) {
int t = json.indexOf(chars[i], fromIndex + 1);
if (t > -1) {
if (idx == -1 || t < idx) {
idx = t;
}
}
}
return idx;
}
public static boolean isOpen(String json, int idx) {
if (idx > -1 && idx < json.length()) {
if (json.charAt(idx) == '{' || json.charAt(idx) == '['){
return true;
}
}
return false;
}
public static boolean isEnd(String json, int idx) {
if (idx > -1 && idx < json.length()) {
if (json.charAt(idx) == '}' || json.charAt(idx) == ']') {
return true;
}
}
return false;
}
}