2011-12-21 33 views
14

Tôi có một chuỗi JSON hợp lệ mà tôi muốn gọn gàng/định dạng sao cho mỗi cặp thuộc tính/giá trị nằm trên dòng riêng của nó, v.v. (hiện tại là trên một dòng w không có dấu cách/dòng nghỉ giải lao).JSON String gọn gàng/định dạng cho Java

Tôi đang sử dụng Apache Sling JSONObject để mô hình đối tượng JSON của mình và biến thành chuỗi, vì vậy nếu Sling JSONObject có thể được đặt thành đầu ra một chuỗi gọn gàng (mà tôi không nghĩ rằng nó có thể) cũng hoạt động.

Nếu tôi cần thư viện của bên thứ 3, tôi muốn có một số phụ thuộc ít nhất là quyền sở hữu (chẳng hạn như Jackson chỉ yêu cầu libs JDK tiêu chuẩn).

Trả lời

18

Bạn không cần một thư viện bên ngoài.

Sử dụng được xây dựng trong máy in khá trong JSONObject Sling của: http://sling.apache.org/apidocs/sling5/org/apache/sling/commons/json/JSONObject.html#toString(int)

java.lang.String công toString (int indentFactor) ném JSONException

Thực hiện một JSON văn bản prettyprinted của JSONObject này. Cảnh báo: Phương pháp này giả định rằng cấu trúc dữ liệu là theo chu kỳ.

Tham số:

indentFactor - Số lượng không gian để thêm vào từng cấp của thụt đầu dòng.

Trả về: có thể in, có thể hiển thị, di động, biểu thị có thể truyền của đối tượng, bắt đầu bằng {(trái cú đúp) và kết thúc bằng} (dấu ngoặc nhọn).

Ném: JSONException - Nếu đối tượng chứa số không hợp lệ.

+0

Phương thức 'JSONObject.getString (value)' có hoạt động khi có một số ý định không? – Erich

+1

@Erich - Không có ý tưởng. Hãy thử nó và xem! – Freiheit

+3

Có, tôi đã dùng thử. – Erich

1

Chuỗi JSON sẽ có "[" và dấu sau "] hàng đầu". Loại bỏ chúng và sau đó sử dụng phương pháp tách từ chuỗi để tách các mục thành một mảng. Sau đó bạn có thể lặp qua mảng của bạn và đặt dữ liệu vào các khu vực có liên quan.

1

nếu sử dụng CQ5 của bạn hoặc bất kỳ CMS JCR dựa như tôi đoán :)

bạn có thể sử dụng java json phân tích cú pháp để thực hiện công việc. nó có một lớp JSONObject và một phương thức toString() để chuyển đổi nó thành String.

để tham khảo thêm tham khảo

http://json.org/java/

+1

Không chắc thế nào tôi bỏ qua nó, nhưng JSONObject.toString() có một phương pháp ghi đè ToString (int thụt lề) mà khi được sử dụng prettifies lên JSON String. Tuy nhiên, chỉ cần gọi JSONObject.toString() thì không. – empire29

31

Với gson bạn có thể làm:

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

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

"Liên kết thư viện JSON Java tốt hơn" bị hỏng – Jay

7

+1 cho câu trả lời gson Johns, nhưng đây là một cách với JSONObject thư viện "chuẩn":

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(); 
     } 

    } 

} 

Cách sử dụng:

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)); 
} 

Output:

{ 
    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

Nhiều thư viện JSON có phương thức .toString(int indentation) đặc biệt

// 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

hoạt động với 'org.apache.sling.commons.json.JSONObject' và' 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

Tốt, thao tác này không có bất kỳ thư viện bên ngoài nào. Tôi sẽ làm cho ở đây một vài thay đổi tuy nhiên: làm theo quy ước java mã hóa và sử dụng StringBuilder thay vì String nối. – andronix

Các vấn đề liên quan