从jackson2.2的ObjectMapper漂亮打印JSON

现在我有一个org.fasterxml.jackson.databind.ObjectMapper的实例,并希望得到一个漂亮的JSON String 。 我的Googlesearch的所有结果都提供了Jackson 1.x的方法,我似乎无法find2.2版本的正确的,不被弃用的方法。 即使我不相信这个代码对于这个问题来说是绝对必要的,但是我现在所知道的是:

 ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(Include.NON_NULL); System.out.println("\n\n----------REQUEST-----------"); StringWriter sw = new StringWriter(); mapper.writeValue(sw, jsonObject); // Want pretty version of sw.toString() here 

您可以通过在ObjectMapper上设置SerializationFeature.INDENT_OUTPUT来启用漂亮打印,如下所示:

 mapper.enable(SerializationFeature.INDENT_OUTPUT); 

据mkyong介绍 ,这个魔法咒语是defaultPrintingWriter来漂亮的打印JSON :

较新版本:

 System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonInstance)); 

旧版本:

 System.out.println(mapper.defaultPrettyPrintingWriter().writeValueAsString(jsonInstance)); 

我似乎很快就跳了起来。 你可以试试gson ,它的构造函数支持漂亮的打印 :

 Gson gson = new GsonBuilder().setPrettyPrinting().create(); String jsonOutput = gson.toJson(someObject); 

希望这可以帮助…

jacksonAPI已经改变:

 new ObjectMapper() .writer() .withDefaultPrettyPrinter() .writeValueAsString(new HashMap<String, Object>()); 

IDENT_OUTPUT没有为我做任何事情,并给出了一个完整的答案,与我的jackson2.2.3jar子:

 public static void main(String[] args) throws IOException { byte[] jsonBytes = Files.readAllBytes(Paths.get("C:\\data\\testfiles\\single-line.json")); ObjectMapper objectMapper = new ObjectMapper(); Object json = objectMapper.readValue( jsonBytes, Object.class ); System.out.println( objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString( json ) ); } 

如果你想为一个进程中的所有ObjectMapper实例默认打开这个function,下面是一个小例子,它将INDENT_OUTPUT的缺省值设置为true:

 val indentOutput = SerializationFeature.INDENT_OUTPUT val defaultStateField = indentOutput.getClass.getDeclaredField("_defaultState") defaultStateField.setAccessible(true) defaultStateField.set(indentOutput, true) 

如果你正在使用弹簧和jackson组合,你可以做如下。 我按照build议,遵循@gregwhitaker,但在春季风格实施。

 <bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg value="yyyy-MM-dd" /> <property name="lenient" value="false" /> </bean> </property> <property name="serializationInclusion"> <value type="com.fasterxml.jackson.annotation.JsonInclude.Include"> NON_NULL </value> </property> </bean> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject"> <ref bean="objectMapper" /> </property> <property name="targetMethod"> <value>enable</value> </property> <property name="arguments"> <value type="com.fasterxml.jackson.databind.SerializationFeature"> INDENT_OUTPUT </value> </property> </bean> 

尝试这个。

  objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);