如何获得精美打印的JSON代码的紧凑形式?

时间:2012-08-29 08:09:08

标签: java json jackson pretty-print

How do I make Jackson's build() method pretty-print its JSON output?这是一个漂亮打印丑陋形式的JSON代码的例子。我需要使用JSON代码的漂亮版本然后将其转移到丑陋的fom。怎么做到呢? 我需要转换它:

 {
   "one" : "AAA",
   "two" : [ "BBB", "CCC" ],
   "three" : {
     "four" : "DDD",
     "five" : [ "EEE", "FFF" ]
   }
 }

到此:

{"one":"AAA","two":["BBB","CCC"],"three":{"four":"DDD","five":["EEE","FFF"]}}

我试图删除'\ n','\ t'和''字符;但是值中可能有一些这样的字符,所以我不能这样做。还有什么可以做的?

4 个答案:

答案 0 :(得分:19)

杰克逊允许你从一个JSON字符串中读取,所以读取漂亮打印的字符串回到杰克逊,然后再次输出它并禁用漂亮的打印。

请参阅converting a String to JSON

简单示例

    String prettyJsonString = "{ \"Hello\" : \"world\"}";
    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode jsonNode = objectMapper.readValue(prettyJsonString, JsonNode.class);
    System.out.println(jsonNode.toString());

<强>要求

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.5.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.3</version>
</dependency>

答案 1 :(得分:6)

使用流API,您可以使用JsonGenerator.copyCurrentEvent()轻松地使用您想要的任何漂亮打印重新输出令牌流,包括默认的无空格;这样可以避免在内存中缓冲整个文档并为文档构建树。

// source and out can be streams, readers/writers, etc.
String source = "   { \"hello\" : \" world \"  }  ";
StringWriter out = new StringWriter();

JsonFactory factory = new JsonFactory();
JsonParser parser = factory.createParser(source);
try (JsonGenerator gen = factory.createGenerator(out)) {
    while (parser.nextToken() != null) {
        gen.copyCurrentEvent(parser);
    }
}

System.out.println(out.getBuffer().toString()); // {"hello":" world "}

您可以使用相同的方法以流式方式打印JSON文档:

// reindent
gen.setPrettyPrinter(new DefaultPrettyPrinter());

答案 2 :(得分:3)

安全的方法是使用"Raw" data binding读取数据,然后再次将其写出来而不启用漂亮的打印机。 Streaming API可能是你的朋友。

如果您使用此模式,则使用正则表达式也会起作用:\s*\n\s*

这不会创建最紧凑的形式(即元素之间仍然会有一些空格)但如果您已将JSON作为字符串,则它是一种廉价的解决方案。这种模式安全的原因是新行在String值中无效(必须使用\n进行转义),这样您就可以安全地删除它们周围的空格。

答案 3 :(得分:1)

Jackosn-core是一种解决方法但我更喜欢使用org.json这是一个非常简单但标准的json lib for java。这里是开源代码 - &gt; stleary/JSON-java

Maven deps

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20160810</version>
</dependency>

使用

        String payload = "{\n" +
            "  \"fact1\": \"Java is verbose.\", \n" +
            "  \"fact2\" : \"C has pointers\"\n" +
            "}";
        System.out.println(new JSONObject(payload));

你会在一行中获得紧凑的json {"fact2":"C has pointers","fact1":"Java is verbose."}