พิมพ์ JSON จาก ObjectMapper ของ Jackson 2.2


141

ตอนนี้ฉันมีตัวอย่าง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

คำตอบ:


277

คุณสามารถเปิดใช้สวยพิมพ์โดยการตั้งค่าSerializationFeature.INDENT_OUTPUTของคุณObjectMapperชอบโดย:

mapper.enable(SerializationFeature.INDENT_OUTPUT);

1
ฉันได้ลองทำเช่นนี้แล้ว แต่ดูเหมือนว่าSerializationConfigจะได้รับการแก้ไข แต่SerializationConfig.Featureไม่ใช่ นี่น่าจะเป็นอีกวิธีหนึ่งในการพิมพ์สวย ๆ ที่เลิกใช้แล้วนอกจากว่าฉันขาดอะไรไป มีFeatureคลาสที่แยกออกมาด้วยตัวของมันเอง แต่ไม่มีINDENT_OUTPUTค่าคงที่ภายใน :(
Anthony Atkinson

ยอดเยี่ยม ฉันชอบที่จะรู้ว่าคุณพบว่า;)
แอนโทนี่แอตกินสัน

1
ฉันดูหนึ่งในโครงการของฉัน แต่ดูเหมือนว่ามันอยู่ที่นี่: github.com/FasterXML/jackson-databindภายใต้ "คุณสมบัติที่ใช้กันทั่วไป"
gregwhitaker

การนำเข้าที่เกี่ยวข้องที่จำเป็นคือการนำเข้า com.fasterxml.jackson.databind {SerializationFeature, ObjectMapper}
dgh

2
ใน 2.2.1 นี่คือสิ่งที่ฉันใช้: import org.codehaus.jackson.map.SerializationConfig.Feature; mapper.enable (Feature.INDENT_OUTPUT);
harschware

46

อ้างอิงจากmkyongคาถาวิเศษคือdefaultPrintingWriterการพิมพ์ JSON :

รุ่นที่ใหม่กว่า:

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

รุ่นเก่ากว่า:

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

ดูเหมือนว่าฉันกระโดดปืนตาดอย่างรวดเร็ว คุณสามารถลองgsonซึ่งคอนสตรัคสนับสนุนการพิมพ์สวย :

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

หวังว่านี่จะช่วย ...


1
ฉันพบบทความนี้และรู้สึกผิดหวังที่พบว่านี่เป็นหนึ่งในวิธีการพิมพ์ที่เลิกใช้แล้ว defaultPrettyPrintingWriter()ไม่สามารถใช้ได้อีกต่อไป (แม้จะเป็นวิธีที่เลิกใช้แล้ว) ในObjectMapperชั้นเรียน
Anthony Atkinson

ฉันคิดจริงๆเกี่ยวกับการทำสิ่งนี้ แต่แอปพลิเคชันของฉันใช้งานแบบแจ็คสันเป็นอย่างมากและฟังก์ชั่นทั้งหมดก็เสร็จสมบูรณ์แล้ว เว็บแอปพลิเคชั่นเซิร์ฟเวอร์ที่โฮสต์นี้กำลังถูกเก็บภาษีอย่างหนักและฉันไม่ต้องการโหลดห้องสมุดเพิ่มเติมเพียงเพื่อการร้องขอและการตอบกลับ แม้ว่าฉันจะลงคะแนนให้กับคำตอบของคุณแน่นอน
Anthony Atkinson

7
@AnthonyAtkinson ใน Jackson 2.3 มีวิธีObjectMapper.writerWithDefaultPrettyPrinter()
ด้าน b

36

jackson API มีการเปลี่ยนแปลง:

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

3
ก็ยังคงเป็นไปได้ (กับแจ็คสัน 2.7.6) new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writer().writeValueAsString(new HashMap<String, Object>());เพื่อใช้ ObjectMapperคุณเพียงแค่ต้องทำให้แน่ใจว่าจะใช้นักเขียนที่คุณได้รับจากการกำหนดค่า
Martin

3

IDENT_OUTPUT ไม่ได้ทำอะไรเพื่อฉันและเพื่อให้คำตอบที่สมบูรณ์แบบที่ทำงานกับแจ็คสัน 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 ) );
}

0

หากคุณต้องการเปิดใช้งานตามค่าเริ่มต้นสำหรับอินสแตนซ์ ObjectMapper ทั้งหมดในกระบวนการนี่คือแฮ็กเล็กน้อยที่จะตั้งค่าเริ่มต้นของ INDENT_OUTPUT เป็นจริง:

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

0

หากคุณใช้การรวมสปริงและแจ็คสันคุณสามารถทำได้ดังต่อไปนี้ ฉันกำลังติดตาม @gregwhitaker ตามที่แนะนำ แต่การนำไปใช้ในรูปแบบสปริง

<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

หากผู้อื่นที่ดูคำถามนี้มีสตริง JSON เท่านั้น (ไม่ใช่ในวัตถุ) คุณสามารถใส่ลงในHashMapและยังสามารถใช้ObjectMapperงานได้ resultตัวแปรสตริง JSON ของคุณ

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

-8

ลองสิ่งนี้

 objectMapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);

13
การทำซ้ำคำตอบที่เลือกหลังจาก 7 เดือนไม่เป็นประโยชน์จริง ๆ
Igor Rodriguez

1
อาจเป็นประโยชน์กับคนที่ฉันกล่าวถึงในบรรทัดเดียวฉันรู้สึกดีในการแบ่งปันสิ่งที่ฉันรู้
รู้สึกดีและเขียนโปรแกรม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.