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

mty*_*urt 20 java json pretty-print jackson

如何让Jackson的build()方法完美打印其JSON输出?这是一个漂亮打印丑陋形式的JSON代码的示例.我需要使用JSON代码的漂亮版本然后将其转移到丑陋的fom.怎么做到呢?我需要转换这个:

 {
   "one" : "AAA",
   "two" : [ "BBB", "CCC" ],
   "three" : {
     "four" : "DDD",
     "five" : [ "EEE", "FFF" ]
   }
 }
Run Code Online (Sandbox Code Playgroud)

对此:

{"one":"AAA","two":["BBB","CCC"],"three":{"four":"DDD","five":["EEE","FFF"]}}
Run Code Online (Sandbox Code Playgroud)

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

Bra*_*rad 19

Jackson允许您从JSON字符串中读取,因此请将漂亮打印的字符串读回Jackson,然后再次输出,并禁用漂亮打印.

请参阅将String转换为JSON

简单的例子

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

需要

<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>
Run Code Online (Sandbox Code Playgroud)

  • 在读取数据时,您可能应该使用 TokenBuffer 类,这样写入会更加高效。 (2认同)
  • 无需放置 core 依赖项,jackson-databind 自动导入 jackson-core 作为传递依赖项 (2认同)

Aar*_*lla 9

安全的方法是使用 JsonNode API 读取数据,然后再次将其写出,而不启用漂亮的打印机。

ObjectMapper m = new ObjectMapper();
JsonNode rootNode = m.readTree(payload);
String compressed = rootNode.toString();
Run Code Online (Sandbox Code Playgroud)

如果对象很大,Streaming API可以提供帮助。

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

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


pra*_*upd 7

Jackosn-core是一种漂亮打印 json 的方法。您可以在这里阅读答案/sf/answers/852194101/

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

Maven依赖

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20160810</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

用法

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

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


Mil*_*les 5

使用流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 "}
Run Code Online (Sandbox Code Playgroud)

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

// reindent
gen.setPrettyPrinter(new DefaultPrettyPrinter());
Run Code Online (Sandbox Code Playgroud)