2013-12-16 22 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); 
    } 
}