24

如何使 Jackson 的 build() 方法漂亮地打印其 JSON 输出?这是一个漂亮地打印 JSON 代码的丑陋形式的示例。我需要采用漂亮的 JSON 代码版本,然后将其转换为丑陋的形式。如何做呢?我需要转换这个:

 {
   "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

4 回答 4

25

Jackson 允许您从 JSON 字符串中读取,因此将漂亮打印的字符串读回 Jackson,然后在禁用漂亮打印的情况下再次输出。

请参阅将字符串转换为 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>
于 2012-08-29T08:57:25.393 回答
7

使用流 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());
于 2013-09-13T02:05:36.787 回答
5

安全的方法是使用“原始”数据绑定读取数据,然后在不启用漂亮打印机的情况下再次将其写出。Streaming API可能是你的朋友。

如果您使用此模式,也可以使用正则表达式:\s*\n\s*

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

于 2012-08-29T08:35:59.047 回答
4

Jackosn-core是漂亮打印 json 的一种方式。您可以在此处阅读答案https://stackoverflow.com/a/12174201/432903

您还可以使用org.json库,这是一个非常简单但标准的 java json 库。在此处开放源代码 -> stleary/JSON-java

maven依赖

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

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

于 2017-02-10T23:48:50.613 回答