从Jackson 2.2的ObjectMapper漂亮地打印JSON


140

现在,我有一个实例,org.fasterxml.jackson.databind.ObjectMapper并希望String使用漂亮的JSON 来获取一个。Google搜索的所有结果都提供了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

Answers:


276

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

mapper.enable(SerializationFeature.INDENT_OUTPUT);

1
我也尝试过此方法,但似乎SerializationConfig已解决,但未解决SerializationConfig.Feature。除非我缺少某些东西,否则这似乎是另一种漂亮的打印方法,该方法也已过时。有一个Feature类是单独分离出来的,但INDENT_OUTPUT内部没有常量。:(
安东尼·阿特金森

优秀的!我很想知道您是如何发现的;)
Anthony Atkinson

1
我看了我的一个项目,但看起来它也在这里:github.com/FasterXML/jackson-databind在“常用的功能”下
gregwhitaker

所需的相关导入是import com.fasterxml.jackson.databind。{SerializationFeature,ObjectMapper}
dgh

2
在2.2.1上,这就是我的工作:import org.codehaus.jackson.map.SerializationConfig.Feature; mapper.enable(Feature.INDENT_OUTPUT);
harschware 2013年

46

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

希望这可以帮助...


1
我找到了这篇文章,但很失望地发现这是漂亮的印刷中不推荐使用的一种方式。defaultPrettyPrintingWriter()ObjectMapper该类上不再可用(甚至不推荐使用)。
安东尼·阿特金森

我实际上是在考虑这样做,但是我的应用程序已经非常注重Jackson了,并且所有功能实际上都是完整的。将要托管在其上的Web应用程序服务器已经承受了沉重的负担,我不想只为记录请求和响应而加载额外的库。不过,我一定会投票给你答案。
安东尼·阿特金森

7
@Jackson 2.3中的AnthonyAtkinson有一种方法ObjectMapper.writerWithDefaultPrettyPrinter()
马特b

36

杰克逊API已更改:

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

3
(在Jackson 2.7.6中)仍然可以使用new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writer().writeValueAsString(new HashMap<String, Object>());。您只需要确保使用从configure中获取的writer ObjectMapper
马丁

3

IDENT_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 ) );
}

0

如果您想默认为一个进程中的所有ObjectMapper实例启用此功能,则可以通过以下小技巧将INDENT_OUTPUT的默认值设置为true:

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

0

如果您使用弹簧和杰克逊组合,则可以按照以下步骤进行操作。我按照建议遵循@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>

0

如果查看此问题的其他人仅具有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();
} 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.