从Jackson 2.2的ObjectMapper中打印JSON

时间:2013-07-12 14:32:40

标签: java json jackson

现在我有一个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

8 个答案:

答案 0 :(得分:248)

您可以通过设置SerializationFeature.INDENT_OUTPUT上的ObjectMapper来启用漂亮打印:

mapper.enable(SerializationFeature.INDENT_OUTPUT);

答案 1 :(得分:44)

根据mkyong,神奇的咒语是defaultPrintingWriterpretty print JSON

较新版本:

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

旧版本:

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

似乎我很快就把枪拉了一下。您可以尝试使用gson

constructor supports pretty-printing
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonOutput = gson.toJson(someObject);

希望这会有所帮助......

答案 2 :(得分:32)

杰克逊API发生了变化:

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

答案 3 :(得分: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 ) );
}

答案 4 :(得分:0)

如果您希望默认情况下为进程中的所有ObjectMapper实例启用此功能,这里有一点将您将INDENT_OUTPUT的默认值设置为true的hack:

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

答案 5 :(得分: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>

答案 6 :(得分:0)

如果其他查看此问题的人只有JSON字符串(对象中没有),则可以将其放入red ed d 中,并且仍然可以使var vid = document.getElementById("myVideo"); //set autoplay vid.autoplay = true; //mute so autoplay has highest chance vid.muted = true; //loop so it dosn't end vid.loop= true; //reload so these effect vid.load(); //play incase vid.play();正常工作。 <video id='myVideo' src ='https://vjs.zencdn.net/v/oceans.mp4'></video>变量是您的JSON字符串。

HashMap

答案 7 :(得分:-7)

试试这个。

 objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);