从 Jackson 2.2的 ObjectMapper 漂亮地打印 JSON

现在我有一个 org.fasterxml.jackson.databind.ObjectMapper的实例,希望得到一个带有漂亮 JSON 的 String。我在谷歌上搜索的所有结果都提供了 Jackson 1. x 的方法,而我似乎找不到合适的、不推荐的方法来用2.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
138063 次浏览

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

希望这个能帮上忙。

你可以通过在你的 ObjectMapper上设置 SerializationFeature.INDENT_OUTPUT来实现美观打印,如下所示:

mapper.enable(SerializationFeature.INDENT_OUTPUT);

试试这个。

 objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);

识别输出没有为我做任何事情,并给出一个完整的答案,工程与我的杰克逊2.2.3罐:

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 实例打开它,这里有一个小窍门,它将把 INDENT _ OUTPUT 的默认值设置为 true:

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

杰克逊空气污染指数已经改变了:

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

如果你使用的是春季和杰克逊组合,你可以这样做。我按照@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>

如果查看这个问题的其他人只有一个 JSON 字符串(不在对象中) ,那么您可以将其放入 HashMap中,并且仍然可以使 ObjectMapper工作。result变量是您的 JSON 字符串。

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.HashMap;
import java.util.Map;


// Pretty-print the JSON result
try {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> response = objectMapper.readValue(result, HashMap.class);
System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(response));
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}