Ответ 1
Вы можете включить красивую печать, установив SerializationFeature.INDENT_OUTPUT
на ваш ObjectMapper
так:
mapper.enable(SerializationFeature.INDENT_OUTPUT);
Прямо сейчас у меня есть экземпляр 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
Вы можете включить красивую печать, установив SerializationFeature.INDENT_OUTPUT
на ваш ObjectMapper
так:
mapper.enable(SerializationFeature.INDENT_OUTPUT);
Согласно mkyong, магическое заклинание defaultPrintingWriter
- красивая печать JSON:
Более новые версии:
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonInstance));
Старые версии:
System.out.println(mapper.defaultPrettyPrintingWriter().writeValueAsString(jsonInstance));
Кажется, я быстро набросился на пистолет. Вы можете попробовать gson, конструктор
API-интерфейс jackson изменился:
new ObjectMapper()
.writer()
.withDefaultPrettyPrinter()
.writeValueAsString(new HashMap<String, Object>());
IDENT_OUTPUT ничего не сделал для меня и дал полный ответ, который работает с моими барабанами jackson 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 по умолчанию:
val indentOutput = SerializationFeature.INDENT_OUTPUT
val defaultStateField = indentOutput.getClass.getDeclaredField("_defaultState")
defaultStateField.setAccessible(true)
defaultStateField.set(indentOutput, true)
если вы используете комбинацию spring и jackson, вы можете сделать это следующим образом. Я следую за @gregwhitaker, как предполагалось, но реализую в стиле spring.
<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);