जैक्सन में JSONNode में JSON स्ट्रिंग पार्स कैसे करें?


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- नहीं। यदि सरल चीजें सरल नहीं हैं, तो एपीआई डिजाइनर विफल हो गया है, आप नहीं।
jameshfisher 17

@ StaxMan का कोड में उत्तर: JsonFactory कारखाना = नया MappingJsonFactory ();
जुआन रोजास

जवाबों:


371

रिचर्ड्स के उत्तर पर थोड़ी भिन्नता लेकिन readTreeएक स्ट्रिंग ले सकते हैं ताकि आप इसे सरल बना सकें:

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

44
किसी को भी, जो ObjectNodeएक JsonNodeप्रयोग के बजाय की जरूरत हैmapper.valueToTree("{\"k1\":\"v1\"}")
मैथ्यू हर्बस्ट

5
@MatthewHerbst 2.5.1 में, यह JSON के रूप में पार्स करने के बजाय स्ट्रिंग {{"k1 \": \ "v1 \"} के साथ एक नया टेक्स्ट नोड बनाता है।
मक्सवेव्यू

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

पार्सर्स बनाने के बारे में और प्रलेखन यहाँ पाया जा सकता है


क्या JsonNode को लेना संभव है, इसे थोड़ा संशोधित करें, और फिर mapper.readValue (नोड, क्लास) को कॉल करें; और एक कक्षा बाहर निकलो?
portforwardpodcast

1
हाँ। वहाँ भी है कि के लिए एक उपनाम है mapper.treeToValue(),। बल्कि readValue()काम भी करता है।
स्टेक्समैन

लिंक टूटा हुआ प्रतीत होता है
मैनुना

28

एक तीसरा संस्करण:

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

JsonNode.class में वास्तव में आपको यहाँ क्या मिला?
डेविड

3
@ डेविड: कुछ भी नहीं, तो स्लैशनिक का संस्करण स्पष्ट रूप से बेहतर है अगर आप सिर्फ एक चाहते हैं JsonNode। हालाँकि, आप आमतौर पर एक नहीं चाहते हैं JsonNode, इसलिए मैं यह बताना चाहता था कि जैक्सन को कैसे बताना है कि आप किस तरह का मूल्य चाहते हैं।
qerub

मेरे लिए, JsonNodeजैक्सन को कुछ और के रूप में डिसेरिएलाइज़ करने से रोकने के लिए , जाहिरा तौर पर गुजरना आवश्यक था - जो विफल हो जाता।
कोरी क्लेन

5

रिचर्ड का जवाब सही है। वैकल्पिक रूप से आप एक MappingJsonFactory(इन org.codehaus.jackson.map) भी बना सकते हैं जो जानता है कि कहां ढूंढना है ObjectMapper। आपको मिली त्रुटि इसलिए थी क्योंकि नियमित JsonFactory( coreपैकेज से) की कोई निर्भरता नहीं है ObjectMapper(जो mapperपैकेज में है)।

लेकिन आमतौर पर आप केवल उपयोग ObjectMapperकरते हैं और JsonParserअन्य निम्न स्तर के घटकों के बारे में चिंता नहीं करते हैं - उन्हें बस ज़रूरत होगी यदि आप स्ट्रीम के डेटा-बाइंड भागों को चाहते हैं, या निम्न-स्तरीय हैंडलिंग करते हैं।


3
import com.github.fge.jackson.JsonLoader;
JsonLoader.fromString("{\"k1\":\"v1\"}")
== JsonNode = {"k1":"v1"}

0

पुराने प्रश्न पर नया दृष्टिकोण। एक समाधान जो जावा 9+ से काम करता है

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

जटिल वस्तुओं के लिए अधिक पठनीय और प्राप्य है। एज

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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.