serialize example java json jackson

example - objectmapper java



Bonita impresiĆ³n JSON del ObjectMapper de Jackson 2.2 (7)

En este momento tengo una instancia de org.fasterxml.jackson.databind.ObjectMapper y me gustaría obtener una String con bastante JSON. Todos los resultados de mis búsquedas de Google han surgido con las formas 1.x de Jackson para hacer esto y parece que no puedo encontrar la forma adecuada y no obsoleta de hacerlo con 2.2. Aunque no creo que el código sea absolutamente necesario para esta pregunta, esto es lo que tengo ahora:

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


IDENT_OUTPUT no hizo nada por mí y para dar una respuesta completa que funciona con mis jarras 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 ) ); }


La API de jackson ha cambiado:

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


Prueba esto.

objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);


Puede habilitar la impresión bonita configurando SerializationFeature.INDENT_OUTPUT en su ObjectMapper manera:

mapper.enable(SerializationFeature.INDENT_OUTPUT);


Según mkyong , el conjuro mágico es defaultPrintingWriter para imprimir bastante JSON :

Versiones más nuevas:

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

Versiones anteriores:

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

Parece que salté el arma un poco rápido. Puede probar gson , cuyo constructor admite impresión bonita :

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

Espero que esto ayude...


Si desea activar esto de forma predeterminada para TODAS las instancias de ObjectMapper en un proceso, aquí hay un pequeño truco que establecerá el valor predeterminado de INDENT_OUTPUT en verdadero:

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


Si está utilizando la combinación de primavera y jackson, puede hacerlo de la siguiente manera. Estoy siguiendo @gregwhitaker como se sugirió, pero implementando en primavera.

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