代码之家  ›  专栏  ›  技术社区  ›  mabuzer

Java中的漂亮打印JSON

  •  172
  • mabuzer  · 技术社区  · 14 年前

    我在用 我需要漂亮地打印JSON数据(使其更具可读性)。

    我在那个库中找不到这个功能。 这通常是如何实现的?

    15 回复  |  直到 9 年前
        1
  •  268
  •   spongebob    9 年前

    GSON 可以用一种很好的方式做到这一点:

    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    JsonParser jp = new JsonParser();
    JsonElement je = jp.parse(uglyJSONString);
    String prettyJsonString = gson.toJson(je);
    
        2
  •  141
  •   spongebob    9 年前

    我用过 org.json

    JSONObject json = new JSONObject(jsonString); // Convert text to object
    System.out.println(json.toString(4)); // Print it with specified indentation
    

    JSON中的字段顺序是每个定义随机的。特定的顺序取决于解析器的实现。

        3
  •  35
  •   spongebob    9 年前

    好像 GSON 支持此功能,但我不知道是否要从正在使用的库中切换。

    从用户指南:

    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    String jsonOutput = gson.toJson(someObject);
    
        4
  •  25
  •   kkurian    5 年前

    和杰克逊在一起( com.fasterxml.jackson.databind ):

    ObjectMapper mapper = new ObjectMapper();
    System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonObject))
    

    How to enable pretty print JSON output (Jackson)

    我知道答案里已经有了,但是我想在这里单独写,因为很有可能,你已经有了Jackson作为依赖项,所以你只需要一行额外的代码

        5
  •  20
  •   spongebob    9 年前

    如果使用Java API进行JSON处理(JSR-353)实现,则可以指定 JsonGenerator.PRETTY_PRINTING 属性创建 JsonGeneratorFactory .

    以下示例最初发布在 blog post

    import java.util.*;
    import javax.json.Json;
    import javax.json.stream.*;
    
    Map<String, Object> properties = new HashMap<String, Object>(1);
    properties.put(JsonGenerator.PRETTY_PRINTING, true);
    JsonGeneratorFactory jgf = Json.createGeneratorFactory(properties);
    JsonGenerator jg = jgf.createGenerator(System.out);
    
    jg.writeStartObject()                    // {
        .write("name", "Jane Doe")           //    "name":"Jane Doe",
        .writeStartObject("address")         //    "address":{
            .write("type", 1)                //        "type":1,
            .write("street", "1 A Street")   //        "street":"1 A Street",
            .writeNull("city")               //        "city":null,
            .write("verified", false)        //        "verified":false
        .writeEnd()                          //    },
        .writeStartArray("phone-numbers")    //    "phone-numbers":[
            .writeStartObject()              //        {
                .write("number", "555-1111") //            "number":"555-1111",
                .write("extension", "123")   //            "extension":"123"
            .writeEnd()                      //        },
            .writeStartObject()              //        {
                .write("number", "555-2222") //            "number":"555-2222",
                .writeNull("extension")      //            "extension":null
            .writeEnd()                      //        }
        .writeEnd()                          //    ]
    .writeEnd()                              // }
    .close();
    
        6
  •  18
  •   Community CDub    7 年前

    漂亮的印花 GSON 一行:

    System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(new JsonParser().parse(jsonString)));
    

    除了内联,这相当于 the accepted answer

        7
  •  17
  •   Agnes    10 年前

    我的情况是,我的项目使用的是不支持漂亮打印的遗留(非JSR)JSON解析器。不过,我需要生成打印精美的JSON示例;只要使用Java 7及以上版本,无需添加任何额外的库,这是可能的:

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine scriptEngine = manager.getEngineByName("JavaScript");
    scriptEngine.put("jsonString", jsonStringNoWhitespace);
    scriptEngine.eval("result = JSON.stringify(JSON.parse(jsonString), null, 2)");
    String prettyPrintedJson = (String) scriptEngine.get("result");
    
        8
  •  8
  •   asksw0rder    7 年前

    基本思想是跳转JSON中基于特殊字符的格式。例如,如果观察到“{”或“[”,代码将创建一个新行并增加缩进级别。

    /**
     * A simple implementation to pretty-print JSON file.
     *
     * @param unformattedJsonString
     * @return
     */
    public static String prettyPrintJSON(String unformattedJsonString) {
      StringBuilder prettyJSONBuilder = new StringBuilder();
      int indentLevel = 0;
      boolean inQuote = false;
      for(char charFromUnformattedJson : unformattedJsonString.toCharArray()) {
        switch(charFromUnformattedJson) {
          case '"':
            // switch the quoting status
            inQuote = !inQuote;
            prettyJSONBuilder.append(charFromUnformattedJson);
            break;
          case ' ':
            // For space: ignore the space if it is not being quoted.
            if(inQuote) {
              prettyJSONBuilder.append(charFromUnformattedJson);
            }
            break;
          case '{':
          case '[':
            // Starting a new block: increase the indent level
            prettyJSONBuilder.append(charFromUnformattedJson);
            indentLevel++;
            appendIndentedNewLine(indentLevel, prettyJSONBuilder);
            break;
          case '}':
          case ']':
            // Ending a new block; decrese the indent level
            indentLevel--;
            appendIndentedNewLine(indentLevel, prettyJSONBuilder);
            prettyJSONBuilder.append(charFromUnformattedJson);
            break;
          case ',':
            // Ending a json item; create a new line after
            prettyJSONBuilder.append(charFromUnformattedJson);
            if(!inQuote) {
              appendIndentedNewLine(indentLevel, prettyJSONBuilder);
            }
            break;
          default:
            prettyJSONBuilder.append(charFromUnformattedJson);
        }
      }
      return prettyJSONBuilder.toString();
    }
    
    /**
     * Print a new line with indention at the beginning of the new line.
     * @param indentLevel
     * @param stringBuilder
     */
    private static void appendIndentedNewLine(int indentLevel, StringBuilder stringBuilder) {
      stringBuilder.append("\n");
      for(int i = 0; i < indentLevel; i++) {
        // Assuming indention using 2 spaces
        stringBuilder.append("  ");
      }
    }
    
        9
  •  6
  •   John DeRegnaucourt    11 年前

    一行:

    String niceFormattedJson = JsonWriter.formatJson(jsonString)
    

    json io库( https://github.com/jdereg/json-io

    除了漂亮地打印JSON之外,您还可以将Java对象(整个Java对象图和循环)序列化为JSON,并将其读入。

        10
  •  6
  •   spongebob    9 年前

    在JSONLib中,您可以使用:

    String jsonTxt = JSONUtils.valueToString(json, 8, 4);
    

    Javadoc

        11
  •  6
  •   spongebob    9 年前

    现在,这可以通过JSONLib库实现:

    http://json-lib.sourceforge.net/apidocs/net/sf/json/JSONObject.html

    如果(并且仅当)使用重载 toString(int indentationFactor) 方法而不是标准 toString() 方法。

    <dependency>
      <groupId>org.json</groupId>
      <artifactId>json</artifactId>
      <version>20140107</version>
    </dependency>
    
        12
  •  5
  •   Jens Piegsa    9 年前

    遵循JSON-P 1.0规范( JSR-353 )对于给定的 JsonStructure JsonObject JsonArray

    import java.io.StringWriter;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.json.Json;
    import javax.json.JsonStructure;
    import javax.json.JsonWriter;
    import javax.json.JsonWriterFactory;
    import javax.json.stream.JsonGenerator;
    
    public class PrettyJson {
    
        private static JsonWriterFactory FACTORY_INSTANCE;
    
        public static String toString(final JsonStructure status) {
    
            final StringWriter stringWriter = new StringWriter();
    
            final JsonWriter jsonWriter = getPrettyJsonWriterFactory()
                    .createWriter(stringWriter);
    
            jsonWriter.write(status);
            jsonWriter.close();
    
            return stringWriter.toString();
        }
    
        private static JsonWriterFactory getPrettyJsonWriterFactory() {
            if (null == FACTORY_INSTANCE) {
                final Map<String, Object> properties = new HashMap<>(1);
                properties.put(JsonGenerator.PRETTY_PRINTING, true);
                FACTORY_INSTANCE = Json.createWriterFactory(properties);
            }
            return FACTORY_INSTANCE;
        }
    
    }
    
        13
  •  5
  •   David Pham    8 年前

    你可以像下面这样使用Gson

    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    String jsonString = gson.toJson(object);
    

    从岗位上 JSON pretty print using Gson

    ObjectMapper mapper = new ObjectMapper();
    String perttyStr = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(object);
    

    从岗位上 Pretty print JSON in Java (Jackson)

    希望能帮上忙!

        14
  •  1
  •   ObiWanKenobi    7 年前

    mapper.writerWithDefaultPrettyPrinter().writeValueAsString(JSONString)
    
        15
  •  0
  •   Valentyn Kolesnikov    5 年前

    Underscore-java 有静态方法 U.formatJson(json) . 我是这个项目的维护者。 Live example

    import com.github.underscore.lodash.U;
    
    public class MyClass {
    
        public static void main(String args[]) {
            String json = "{\"Price\": {"
            + "    \"LineItems\": {"
            + "        \"LineItem\": {"
            + "            \"UnitOfMeasure\": \"EACH\", \"Quantity\": 2, \"ItemID\": \"ItemID\""
            + "        }"
            + "    },"
            + "    \"Currency\": \"USD\","
            + "    \"EnterpriseCode\": \"EnterpriseCode\""
            + "}}";
            System.out.println(U.formatJson(json)); 
        }
    }
    

    {
       "Price": {
          "LineItems": {
             "LineItem": {
                "UnitOfMeasure": "EACH",
                "Quantity": 2,
                "ItemID": "ItemID"
             }
          },
          "Currency": "USD",
          "EnterpriseCode": "EnterpriseCode"
       }
    }