Cukup mencetak JSON dari ObjectMapper Jackson 2.2


141

Saat ini saya memiliki contoh org.fasterxml.jackson.databind.ObjectMapperdan ingin mendapatkan Stringdengan JSON yang cantik. Semua hasil pencarian Google saya telah datang dengan Jackson 1.x cara melakukan ini dan saya tidak bisa menemukan cara yang tepat, tidak usang melakukan ini dengan 2.2. Meskipun saya tidak percaya bahwa kode mutlak diperlukan untuk pertanyaan ini, inilah yang saya miliki sekarang:

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

Jawaban:


277

Anda dapat mengaktifkan pencetakan cantik dengan mengatur seperti SerializationFeature.INDENT_OUTPUTAnda di ObjectMapper:

mapper.enable(SerializationFeature.INDENT_OUTPUT);

1
Saya juga sudah mencoba ini tetapi tampaknya SerializationConfigsudah diselesaikan tetapi SerializationConfig.Featuretidak. Ini tampaknya menjadi metode pencetakan cantik lainnya yang sudah usang kecuali saya kehilangan sesuatu. Ada Featurekelas yang dipisahkan sendiri, tetapi tidak memiliki INDENT_OUTPUTkonstanta di dalamnya. :(
Anthony Atkinson

Luar biasa! Saya ingin tahu bagaimana Anda menemukan itu;)
Anthony Atkinson

1
Saya melihat salah satu proyek saya, tetapi tampaknya ada juga di sini: github.com/FasterXML/jackson-databind di bawah "Fitur yang Biasa Digunakan"
gregwhitaker

Impor yang relevan diperlukan adalah impor com.fasterxml.jackson.databind. {SerializationFeature, ObjectMapper}
dgh

2
pada 2.2.1 inilah yang diperlukan untuk saya: import org.codehaus.jackson.map.SerializationConfig.Feature; mapper.enable (Feature.INDENT_OUTPUT);
harschware

46

Menurut mkyong , mantra sihir defaultPrintingWriteruntuk cukup mencetak JSON :

Versi yang lebih baru:

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

Versi yang lebih lama:

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

Sepertinya saya melompat sedikit dengan cepat. Anda dapat mencoba gson , yang konstruktornya mendukung pencetakan cantik :

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

Semoga ini membantu...


1
Saya menemukan artikel ini dan kecewa menemukan bahwa ini adalah salah satu cara pencetakan yang sudah usang. defaultPrettyPrintingWriter()tidak lagi tersedia (bahkan sebagai metode usang) di ObjectMapperkelas.
Anthony Atkinson

Saya sebenarnya berpikir untuk melakukan ini, tetapi aplikasi saya sudah sangat berorientasi pada Jackson dan semua fungsi sebenarnya lengkap. Server aplikasi web tempat ini akan dihosting sudah dikenakan pajak cukup berat, dan saya tidak ingin memuat perpustakaan tambahan hanya untuk mencatat permintaan dan tanggapan. Saya pasti akan memilih-up jawaban Anda.
Anthony Atkinson

7
@AnthonyAtkinson di Jackson 2.3 ada metodeObjectMapper.writerWithDefaultPrettyPrinter()
matt b

36

API jackson telah berubah:

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

3
Masih mungkin (dengan Jackson 2.7.6) untuk digunakan new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writer().writeValueAsString(new HashMap<String, Object>());. Anda hanya perlu memastikan untuk menggunakan penulis yang Anda dapatkan dari yang dikonfigurasi ObjectMapper.
Martin

3

IDENT_OUTPUT tidak melakukan apa pun untuk saya, dan untuk memberikan jawaban lengkap yang berfungsi dengan stoples jackson 2.2.3 saya:

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

Jika Anda ingin mengaktifkannya secara default untuk SEMUA instance ObjectMapper dalam suatu proses, berikut ini adalah hack kecil yang akan menetapkan nilai default INDENT_OUTPUT menjadi true:

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

0

jika Anda menggunakan kombinasi pegas dan jackson, Anda dapat melakukannya sebagai berikut. Saya mengikuti @gregwhitaker seperti yang disarankan tetapi menerapkan gaya semi.

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

0

Jika orang lain yang melihat pertanyaan ini hanya memiliki string JSON (bukan di objek), maka Anda bisa memasukkannya ke dalam HashMapdan masih bisa ObjectMapperberfungsi. The resultvariabel string JSON Anda.

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();
} 

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.