วิธีการแยกสตริง JSON เป็น JsonNode ใน Jackson


231

มันควรจะง่ายมาก แต่ฉันไม่สามารถหามันได้หลังจากลองใช้เวลาหนึ่งชั่วโมง

ฉันต้องได้รับสตริง JSON สำหรับตัวอย่างเช่นแจงเป็น{"k1":v1,"k2":v2}JsonNode

JsonFactory factory = new JsonFactory();
JsonParser jp = factory.createJsonParser("{\"k1\":\"v1\"}");
JsonNode actualObj = jp.readValueAsTree();

จะช่วยให้

java.lang.IllegalStateException: No ObjectCodec defined for the parser, can not deserialize JSON into JsonNode tree


54
#embarrasing- ไม่ หากสิ่งที่เรียบง่ายไม่ง่ายนักออกแบบ API ก็ล้มเหลวไม่ใช่คุณ
jameshfisher

@ คำตอบของ StaxMan ในรหัส: JsonFactory factory = new MappingJsonFactory ();
Juan Rojas

คำตอบ:


371

ความแตกต่างเล็กน้อยในคำตอบของริชาร์ดส์ แต่readTreeสามารถนำสตริงไปใช้

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree("{\"k1\":\"v1\"}");

44
สำหรับทุกคนที่ต้องการObjectNodeมากกว่าการJsonNodeใช้mapper.valueToTree("{\"k1\":\"v1\"}")
Matthew Herbst

5
@MatthewHerbst ใน 2.5.1 สิ่งนี้จะสร้างโหนดข้อความใหม่ด้วยสตริง "{\" k1 \ ": \" v1 \ "}" แทนที่จะแยกเป็น JSON
Minexew

69

คุณต้องใช้ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
JsonFactory factory = mapper.getJsonFactory(); // since 2.1 use mapper.getFactory() instead
JsonParser jp = factory.createJsonParser("{\"k1\":\"v1\"}");
JsonNode actualObj = mapper.readTree(jp);

เอกสารเพิ่มเติมเกี่ยวกับการสร้าง parsers สามารถพบได้ที่นี่


เป็นไปได้ที่จะใช้ JsonNode, แก้ไขมันเล็กน้อยแล้วเรียก mapper.readValue (โหนด, คลาส); และออกไปเรียน?
portforwardpodcast

1
ใช่. mapper.treeToValue()มีแม้กระทั่งนามแฝงสำหรับว่า แต่readValue()ยังใช้งานได้
StaxMan

ลิงค์ดูเหมือนจะเสียหาย
manuna

28

ตัวแปรที่สาม:

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readValue("{\"k1\":\"v1\"}", JsonNode.class);

สิ่งที่ผ่านไปใน JsonNode.class ทำให้คุณมาที่นี่จริงหรือ
เดวิด

3
@ David: ไม่มีอะไรดังนั้นตัวแปร slashnick JsonNodeเป็นที่เห็นได้ชัดดีกว่าถ้าคุณเพียงต้องการ อย่างไรก็ตามคุณมักจะไม่ต้องการJsonNodeดังนั้นฉันต้องการแสดงวิธีบอกแจ็คสันมูลค่าที่คุณต้องการ
qerub

สำหรับฉันการผ่านไปJsonNodeนั้นเป็นสิ่งที่จำเป็นเพื่อป้องกันไม่ให้แจ็คสันปลด deserializing เป็นอย่างอื่น
Cory Klein

5

คำตอบของ Richard ถูกต้อง หรือคุณสามารถสร้างMappingJsonFactory(ในorg.codehaus.jackson.map) ซึ่งรู้ว่าจะหาObjectMapperที่ไหน ข้อผิดพลาดที่คุณได้รับเนื่องจากปกติJsonFactory(จากcoreแพ็คเกจ) ไม่มีการพึ่งพาObjectMapper(ซึ่งอยู่ในmapperแพ็คเกจ)

แต่โดยปกติคุณจะใช้ObjectMapperและไม่ต้องกังวลJsonParserหรือส่วนประกอบระดับต่ำอื่น ๆ - พวกเขาจะต้องการถ้าคุณต้องการผูกข้อมูลส่วนของกระแสข้อมูลหรือทำการจัดการระดับต่ำ



0

วิธีการใหม่สำหรับคำถามเก่า โซลูชันที่ใช้งานได้จาก java 9+

ObjectNode agencyNode = new ObjectMapper().valueToTree(Map.of("key", "value"));

สามารถอ่านและบำรุงรักษาได้มากกว่าสำหรับวัตถุที่ซับซ้อน Ej

Map<String, Object> agencyMap = Map.of(
        "name", "Agencia Prueba",
        "phone1", "1198788373",
        "address", "Larrea 45 e/ calligaris y paris",
        "number", 267,
        "enable", true,
        "location", Map.of("id", 54),
        "responsible", Set.of(Map.of("id", 405)),
        "sellers", List.of(Map.of("id", 605))
);
ObjectNode agencyNode = new ObjectMapper().valueToTree(agencyMap);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.