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