2013-12-16 23 views
0

假設一個不完整的JSON字符串(例如中間被截斷)怎樣才能最好地打印出我擁有的字符?我爲JSON遇到的所有漂亮打印都涉及到庫,但他們假定有一個有效且完整的JSON結構。如何在Java中打印無效/不完整的JSON

我很好用這裏所描述的XML格式的「蠻力」的方法:How to pretty print XML from Java?

類似處理任何想法JSON?我不想分析整個JSON結構,因爲它可能很龐大,我只想把它的一小部分打印出來用於記錄目的,我希望它是最小的和快速的 - 然後我希望它漂亮打印)。

+1

這將是具有挑戰性的,因爲結構不能從無效的JSON推斷。這就是整個問題。 – Taylor

+0

因此,沒有辦法與正則表達式做類似的問題/答案我鏈接的XML? –

+0

如何在JSON的末尾添加'''','}',')'和''以使其正確解析? – johnchen902

回答

1

這就是我最終解決這個問題的方法。不是一個很好的解決方案,但不知道如何做得更好(考慮到有問題的輸入限制)。不過,它運行良好,並試圖儘可能地打印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); 
    } 
}