2013-12-16 2 views
0

불완전한 JSON 문자열 (예 : 중간에 자르면)을 가정하면 내가 갖고있는 문자를 가장 잘 인쇄 할 수 있습니까? JSON에 대한 모든 멋진 인쇄는 라이브러리를 포함하지만 유효하고 완벽한 JSON 구조를 가정합니다.Java에서 유효하지 않은/불완전한 JSON을 인쇄하는 방법

내가 XML 여기 설명 된대로 "무차별"방법을 사용하여와 괜찮아 : 비슷한 취급을위한 How to pretty print XML from Java?

어떤 아이디어를 JSON을 위해?

(전체 JSON 구조를 구문 분석하고 싶지는 않습니다. 최소한의 로깅 목적으로 인쇄하기를 원합니다. 인쇄).

+1

잘못된 JSON에서 구조를 추론 할 수 없으므로 도전적입니다. 그게 전부 요점입니다. – Taylor

+0

그래서 XML에 링크 된 question/answer와 같은 방식으로 regexp와 비슷한 작업을 수행 할 방법이 없습니까? –

+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); 
    } 
} 
관련 문제