2011-12-21 31 views
14

Mam poprawny ciąg JSON, który chcę uporządkować/sformatować tak, aby każda para właściwości/wartości była we własnym wierszu itp. (Obecnie jest w jednym wierszu bez spacji/linii przerwy).JSON String tidy/formatter dla Javy

Używam Apache Sling JSONObject modelować moje JSON obiekt i przekształcić go w ciąg, więc jeśli chusta JSONObject można ustawić na wyjściu porządek ciąg (który ja nie sądzę, że można), która będzie działać zbyt.

Jeśli potrzebuję lib innej firmy, wolę jedną niż kilka zależności od możliwości (takich jak Jackson, który wymaga tylko std-owych bibliotek JDK).

Odpowiedz

18

Nie potrzeba zewnętrzną bibliotekę.

użyć wbudowanego w ładnej drukarki w chuście na JSONObject: http://sling.apache.org/apidocs/sling5/org/apache/sling/commons/json/JSONObject.html#toString(int)

java.lang.String publicznych toString (int indentFactor) rzuca JSONException

Zrób Ładnie JSON tekst tego JSONObject. Ostrzeżenie: ta metoda zakłada, że ​​struktura danych ma charakter acykliczny.

Parametry:

indentFactor - liczba miejsc, aby dodać do każdego poziomu wcięcia.

Powroty: a nadruk, wyświetlanych przenośne przenoszony reprezentacja obiektu, począwszy od lewej {(nawias) i kończąc} (prawy nawias).

Zgłasza: JSONException - Jeśli obiekt zawiera nieprawidłowy numer.

+0

Czy metoda 'JSONObject.getString (value)' działa, gdy jest jakieś intencje? – Erich

+1

@Erich - Brak pomysłu. Wypróbuj i zobacz! – Freiheit

+3

To prawda, wypróbowałem to. – Erich

1

Łańcuch JSON będzie miał wiodący "[" i końcowy "]". Usuń te, a następnie użyj metody dzielenia z ciągu znaków, aby oddzielić elementy do tablicy. Następnie możesz powtórzyć swoją tablicę i umieścić dane w odpowiednich obszarach.

1

jeśli używając CQ5 lub JCR na podstawie dowolnego CMS jak myślę :)

można użyć java json parser, aby wykonać zadanie. ma klasę JSONObject i toString(), aby przekonwertować ją do String.

dla dalszego odniesienia odnoszą

http://json.org/java/

+1

Nie wiem, jak ja przeoczyłem, ale JSONObject.toString() ma sposobu obejścia .ToString (int tiret), który stosowany prettifies się reprezentacji JSON String. Samo wywołanie JSONObject.toString() jednak nie. – empire29

31

Z gson można zrobić:

JsonParser parser = new JsonParser(); 
Gson gson = new GsonBuilder().setPrettyPrinting().create(); 

JsonElement el = parser.parse(jsonString); 
jsonString = gson.toJson(el); // done 
+0

"Lepsza biblioteka JSON biblioteki Java" jest zerwana – Jay

7

+1 dla Johns za gson odpowiedź, ale oto sposób z "standardowego" biblioteki JSONObject:

public class JsonFormatter{ 

    public static String format(final JSONObject object) throws JSONException{ 
     final JsonVisitor visitor = new JsonVisitor(4, ' '); 
     visitor.visit(object, 0); 
     return visitor.toString(); 
    } 

    private static class JsonVisitor{ 

     private final StringBuilder builder = new StringBuilder(); 
     private final int indentationSize; 
     private final char indentationChar; 

     public JsonVisitor(final int indentationSize, final char indentationChar){ 
      this.indentationSize = indentationSize; 
      this.indentationChar = indentationChar; 
     } 

     private void visit(final JSONArray array, final int indent) throws JSONException{ 
      final int length = array.length(); 
      if(length == 0){ 
       write("[]", indent); 
      } else{ 
       write("[", indent); 
       for(int i = 0; i < length; i++){ 
        visit(array.get(i), indent + 1); 
       } 
       write("]", indent); 
      } 

     } 

     private void visit(final JSONObject obj, final int indent) throws JSONException{ 
      final int length = obj.length(); 
      if(length == 0){ 
       write("{}", indent); 
      } else{ 
       write("{", indent); 
       final Iterator<String> keys = obj.keys(); 
       while(keys.hasNext()){ 
        final String key = keys.next(); 
        write(key + " :", indent + 1); 
        visit(obj.get(key), indent + 1); 
        if(keys.hasNext()){ 
         write(",", indent + 1); 
        } 
       } 
       write("}", indent); 
      } 

     } 

     private void visit(final Object object, final int indent) throws JSONException{ 
      if(object instanceof JSONArray){ 
       visit((JSONArray) object, indent); 
      } else if(object instanceof JSONObject){ 
       visit((JSONObject) object, indent); 
      } else{ 
       if(object instanceof String){ 
        write("\"" + (String) object + "\"", indent); 
       } else{ 
        write(String.valueOf(object), indent); 
       } 
      } 

     } 

     private void write(final String data, final int indent){ 
      for(int i = 0; i < (indent * indentationSize); i++){ 
       builder.append(indentationChar); 
      } 
      builder.append(data).append('\n'); 
     } 

     @Override 
     public String toString(){ 
      return builder.toString(); 
     } 

    } 

} 

Zastosowanie:

public static void main(final String[] args) throws JSONException{ 
    final JSONObject obj = 
      new JSONObject("{\"glossary\":{\"title\": \"example glossary\", \"GlossDiv\":{\"title\": \"S\", \"GlossList\":{\"GlossEntry\":{\"ID\": \"SGML\", \"SortAs\": \"SGML\", \"GlossTerm\": \"Standard Generalized Markup Language\", \"Acronym\": \"SGML\", \"Abbrev\": \"ISO 8879:1986\", \"GlossDef\":{\"para\": \"A meta-markup language, used to create markup languages such as DocBook.\", \"GlossSeeAlso\": [\"GML\", \"XML\"]}, \"GlossSee\": \"markup\"}}}}}"); 
    System.out.println(JsonFormatter.format(obj)); 
} 

wyjściowa:

{ 
    glossary : 
    { 
     title : 
     "example glossary" 
     , 
     GlossDiv : 
     { 
      GlossList : 
      { 
       GlossEntry : 
       { 
        SortAs : 
        "SGML" 
        , 
        GlossDef : 
        { 
         GlossSeeAlso : 
         [ 
          "GML" 
          "XML" 
         ] 
         , 
         para : 
         "A meta-markup language, used to create markup languages such as DocBook." 
        } 
        , 
        GlossSee : 
        "markup" 
        , 
        GlossTerm : 
        "Standard Generalized Markup Language" 
        , 
        ID : 
        "SGML" 
        , 
        Acronym : 
        "SGML" 
        , 
        Abbrev : 
        "ISO 8879:1986" 
       } 
      } 
      , 
      title : 
      "S" 
     } 
    } 
} 
13

Wiele bibliotek JSON ma specjalną metodę .toString(int indentation)

// if it's not already, convert to a JSON object 
JSONObject jsonObject = new JSONObject(jsonString); 
// To string method prints it with specified indentation 
System.out.println(jsonObject.toString(4)); 
+0

działa to z 'org.apache.sling.commons.json.JSONObject' i' org.json.JSONObject' –

2
public static String formatJSONStr(final String json_str, final int indent_width) { 
    final char[] chars = json_str.toCharArray(); 
    final String newline = System.lineSeparator(); 

    String ret = ""; 
    boolean begin_quotes = false; 

    for (int i = 0, indent = 0; i < chars.length; i++) { 
     char c = chars[i]; 

     if (c == '\"') { 
      ret += c; 
      begin_quotes = !begin_quotes; 
      continue; 
     } 

     if (!begin_quotes) { 
      switch (c) { 
      case '{': 
      case '[': 
       ret += c + newline + String.format("%" + (indent += indent_width) + "s", ""); 
       continue; 
      case '}': 
      case ']': 
       ret += newline + ((indent -= indent_width) > 0 ? String.format("%" + indent + "s", "") : "") + c; 
       continue; 
      case ':': 
       ret += c + " "; 
       continue; 
      case ',': 
       ret += c + newline + (indent > 0 ? String.format("%" + indent + "s", "") : ""); 
       continue; 
      default: 
       if (Character.isWhitespace(c)) continue; 
      } 
     } 

     ret += c + (c == '\\' ? "" + chars[++i] : ""); 
    } 

    return ret; 
} 
+0

Dobrze, działało to bez zewnętrznej biblioteki. Wprowadziłbym jednak kilka zmian: przestrzegaj konwencji kodowania java i używaj StringBuilder zamiast łączenia ciągów. – andronix