156

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

8 回答 8

297

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

mapper.enable(SerializationFeature.INDENT_OUTPUT);
于 2013-07-12T14:59:53.473 回答
48

根据mkyong的说法,神奇的咒语是漂亮defaultPrintingWriter打印 JSON

较新的版本:

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

旧版本:

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

看来我有点急了。您可以尝试gson,其构造函数支持 pretty-printing

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

希望这可以帮助...

于 2013-07-12T14:38:21.377 回答
37

杰克逊 API 发生了变化:

new ObjectMapper()
.writer()
.withDefaultPrettyPrinter()
.writeValueAsString(new HashMap<String, Object>());
于 2015-05-23T09:41:54.457 回答
3

IDENT_OUTPUT 没有为我做任何事情,并给出一个适用于我的 jackson 2.2.3 jar 的完整答案:

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 ) );
}
于 2015-03-18T17:28:02.727 回答
0

如果您想为进程中的所有 ObjectMapper 实例默认打开此功能,这里有一个小技巧,可以将 INDENT_OUTPUT 的默认值设置为 true:

val indentOutput = SerializationFeature.INDENT_OUTPUT
val defaultStateField = indentOutput.getClass.getDeclaredField("_defaultState")
defaultStateField.setAccessible(true)
defaultStateField.set(indentOutput, true)
于 2015-04-10T02:17:12.643 回答
0

如果您使用的是 spring 和 jackson 组合,您可以按照以下方式进行操作。我按照建议关注@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>
于 2016-03-09T06:31:35.833 回答
0

如果查看此问题的其他人只有一个 JSON 字符串(不在对象中),那么您可以将其放入 aHashMap并仍然可以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();
} 
于 2020-02-01T00:41:43.830 回答
-8

试试这个。

 objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);
于 2015-02-26T04:37:19.770 回答