2013-12-16 3 views
0

Предполагая, что неполная строка JSON (отрезанная посередине, например,), как я могу лучше всего печатать символы, которые у меня есть? Вся красивая печать, с которой я столкнулась в JSON, включает библиотеки, но они предполагают действительную и полную структуру JSON.Как довольно печатать недействительные/неполные JSON в Java

Я в порядке с использованием метода «грубой силы», как описано здесь 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); 
    } 
} 
Смежные вопросы