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
Anthony Atkinson
sumber

Jawaban:

277

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

mapper.enable(SerializationFeature.INDENT_OUTPUT);
pembuat gregwhit
sumber
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...

hd1
sumber
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>());
Rian
sumber
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 ) );
}
Stan Towianski
sumber
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)
Graham Lea
sumber
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>
MohanaRao SV
sumber
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();
} 
Azurespot
sumber
-8

Coba ini.

 objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);
merasa baik dan pemrograman
sumber
13
Menggandakan jawaban yang dipilih setelah 7 bulan tidak terlalu membantu.
Igor Rodriguez
1
mungkin membantu seseorang seperti yang saya sebutkan dalam satu baris, saya merasa senang berbagi apa pun yang saya ketahui.
merasa baik dan pemrograman