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

如何让Jackson的build()方法打印出JSON输出呢? 这是一个漂亮打印丑陋forms的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’和”字符; 但是值中可能有一些这样的字符,所以我不能这样做。 还有什么可以做的?

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

需要

  com.fasterxml.jackson.core jackson-core 2.5.3   com.fasterxml.jackson.core jackson-databind 2.5.3  

使用流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()); 

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

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

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

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

Maven deps

  org.json json 20160810  

用法

  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."}在一行中。