2013-07-12 14 views
97

Teraz mam instancję org.fasterxml.jackson.databind.ObjectMapper i chciałbym uzyskać String z ładnym JSON. Wszystkie wyniki moich wyszukiwań w Google wymyśliły sposób, w jaki Jackson 1.x to robił i nie wydaje mi się, żeby znalazłem właściwy, nie deprecjonowany sposób robienia tego za pomocą 2.2. Choć nie wierzę, że kod jest absolutnie niezbędne do tego pytania, oto co mam teraz:Ładne drukowanie JSON z ObjectMapper Jackson 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 

Odpowiedz

196

Można włączyć ładnego drukowania poprzez ustawienie SerializationFeature.INDENT_OUTPUT na swój ObjectMapper tak:

mapper.enable(SerializationFeature.INDENT_OUTPUT); 
+0

Próbowałem również tego, ale wydaje się, że 'SerializationConfig' został rozwiązany, ale' SerializationConfig.Feature' nie jest.Wydaje się, że jest to kolejna metoda ładnego drukowania, która jest również przestarzała, chyba że czegoś mi brakuje. Istnieje klasa "Feature", która jest oddzielona osobno, ale nie ma stałej 'INDENT_OUTPUT' wewnątrz. :( –

+0

@Anthony Atkinson - Edytowałem odpowiedź na Jackson2. – gregwhitaker

+0

Dobrze! Chciałbym wiedzieć, jak to znalazłeś;) –

29

Według mkyong, magiczne zaklęcie jest defaultPrintingWriter do pretty print JSON:

Nowsze wersje:

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

Starsze wersje:

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

Wygląda na to, że szybko podniosłem pistolet. Można spróbować gson, którego constructor supports pretty-printing:

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

Hope this helps ...

+0

znalazłem ten artykuł i zawiodłem się do stwierdzenia, że ​​jest to jeden z tych przestarzałych sposobów drukowania ładna. 'defaultPrettyPrintingWriter()' nie jest już dostępny (nawet jako nieaktualna metoda) w klasie 'ObjectMapper'. –

+0

Tak naprawdę myślałem o zrobieniu tego, ale moja aplikacja jest już mocno zorientowana na Jacksona i cała ta funkcjonalność jest rzeczywiście kompletna. Serwer aplikacji internetowych, na którym będzie to hostowane, jest już dość mocno opodatkowany, a ja nie chciałbym ładować dodatkowych bibliotek po prostu dla rejestrowania żądań i odpowiedzi. Zdecydowanie jednak zagłosuję za twoją odpowiedzią. –

+5

@AnthonyAtkinson w Jackson 2.3 istnieje metoda 'ObjectMapper.writerWithDefaultPrettyPrinter()' –

-7

Try This .

objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT); 
+9

Powielanie wybranej odpowiedzi po 7 miesiącach nie jest zbyt pomocne. –

+1

może być pomocny dla kogoś, o czym wspomniałem w jednym wierszu, dobrze się czuję dzieląc się tym, co wiem. –

2

IDENT_OUTPUT nic nie zrobił dla mnie, aby dać pełną odpowiedź, która współpracuje z moich Jackson 2.2.3 słoikach:

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

Jeśli chcesz, aby to włączyć domyślnie dla WSZYSTKICH ObjectMapper przypadkach w procesie, oto mały hack, który będzie ustawić domyślną wartość INDENT_OUTPUT true:

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

Jackson API zmieniła:

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

Nadal możliwe jest (z Jackson 2.7.6) używanie 'nowej ObjectMapper(). Configure (SerializationFeature.INDENT_OUTPUT, true) .writer(). WriteValueAsString (nowa HashMap ());'. Trzeba tylko upewnić się, że użyjemy pisarza, który otrzymujemy ze skonfigurowanego 'ObjectMapper'. – Martin

0

jeśli używasz kombinacji wiosna i jackson, możesz to zrobić w następujący sposób. Śledzę @ gregwhitaker zgodnie z sugestią, ale wdrażam w stylu wiosennym.

<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> 
Powiązane problemy