[英]How to pretty print invalid/incomplete JSON in Java
假設一個不完整的JSON字符串(例如,在中間被截斷),我怎樣才能最好地打印出我擁有的字符? 我為JSON遇到的所有漂亮打印都涉及到庫,但是它們假定一個有效且完整的JSON結構。
我對XML使用這里介紹的“強力”方法很好 : 如何從Java漂亮地打印XML?
對JSON進行類似處理有什么想法嗎?
(我不想解析整個JSON結構,因為它可能很龐大,我只希望將其一小部分打印出來以用於日志記錄目的,而我希望它最小且快速-然后我希望將其漂亮地打印出來)。
這就是我最終解決此問題的方式。 這不是一個很好的解決方案,但是不確定是否可以做得更好(考慮到輸入限制問題)。 但是,它運行良好,並嘗試以最佳方式漂亮地打印json。 它基於此處為PHP提供的解決方案: https : //gist.github.com/GloryFish/1045396
public String prettyPrintJSONAsString(String jsonString) {
int tabCount = 0;
StringBuffer prettyPrintJson = new StringBuffer();
String lineSeparator = "\r\n";
String tab = " ";
boolean ignoreNext = false;
boolean inQuote = false;
char character;
/* Loop through each character to style the output */
for (int i = 0; i < jsonString.length(); i++) {
character = jsonString.charAt(i);
if (inQuote) {
if (ignoreNext) {
ignoreNext = false;
} else if (character == '"') {
inQuote = !inQuote;
}
prettyPrintJson.append(character);
} else {
if (ignoreNext ? ignoreNext = !ignoreNext : ignoreNext);
switch (character) {
case '[':
++tabCount;
prettyPrintJson.append(character);
prettyPrintJson.append(lineSeparator);
printIndent(tabCount, prettyPrintJson, tab);
break;
case ']':
--tabCount;
prettyPrintJson.append(lineSeparator);
printIndent(tabCount, prettyPrintJson, tab);
prettyPrintJson.append(character);
break;
case '{':
++tabCount;
prettyPrintJson.append(character);
prettyPrintJson.append(lineSeparator);
printIndent(tabCount, prettyPrintJson, tab);
break;
case '}':
--tabCount;
prettyPrintJson.append(lineSeparator);
printIndent(tabCount, prettyPrintJson, tab);
prettyPrintJson.append(character);
break;
case '"':
inQuote = !inQuote;
prettyPrintJson.append(character);
break;
case ',':
prettyPrintJson.append(character);
prettyPrintJson.append(lineSeparator);
printIndent(tabCount, prettyPrintJson, tab);
break;
case ':':
prettyPrintJson.append(character + " ");
break;
case '\\':
prettyPrintJson.append(character);
ignoreNext = true;
break;
default:
prettyPrintJson.append(character);
break;
}
}
}
return prettyPrintJson.toString();
}
private void printIndent(int count, StringBuffer stringBuffer, String indent) {
for (int i = 0; i < count; i++) {
stringBuffer.append(indent);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.