জ্যাকসনের জসননোডে জেএসএন স্ট্রিংকে কীভাবে পার্স করবেন?


231

এটি এত সহজ হওয়া উচিত, তবে আমি এক ঘন্টা চেষ্টা করার পরেও এটি খুঁজে পাচ্ছি না emb

আমার একটি জেএসএন স্ট্রিং পেতে হবে, উদাহরণস্বরূপ, এ {"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- না। যদি সাধারণ জিনিসগুলি সহজ না হয়, তবে এপিআই ডিজাইনার ব্যর্থ হয়েছে, আপনি নয়।
জামেশফিশার

@ কোডে স্ট্যাক্সম্যানের উত্তর: জসনফ্যাক্টরি ফ্যাক্টরি = নতুন ম্যাপিংজেসনফ্যাক্টরি ();
জুয়ান রোজাস

উত্তর:


371

রিচার্ডস এর উত্তরটিতে সামান্য প্রকরণের উত্তর কিন্তু readTreeএকটি স্ট্রিং নিতে পারে যাতে আপনি এটিকে সহজ করতে পারেন:

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

44
যার ব্যবহারের ObjectNodeপরিবর্তে প্রয়োজনের JsonNodeজন্যmapper.valueToTree("{\"k1\":\"v1\"}")
ম্যাথু হার্বস্ট

5
@ ম্যাথহেহবার্স্ট ২.২.১ এ, এটি JSON হিসাবে পার্স করার পরিবর্তে "{\" কে 1 \ ": \" ভি 1 \ "}" স্ট্রিং সহ একটি নতুন পাঠ্য নোড তৈরি করে।
মাইনেক্সিউ

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

পার্সার তৈরি সম্পর্কে আরও ডকুমেন্টেশন এখানে পাওয়া যাবে


জসননোড নেওয়া, এটি কিছুটা সংশোধন করা এবং তারপরে ম্যাপার.ড্রেডভ্যালু (নোড, শ্রেণি) কল করা কি সম্ভব; এবং একটি ক্লাস খুঁজে পেতে?
পোর্টফোরওয়ার্ডপোডকাস্ট

1
হ্যাঁ. এমনকি এর জন্য একটি উপাধি আছে mapper.treeToValue(),। কিন্তু readValue()কাজ করে।
স্টেক্সম্যান 18

লিঙ্কটি নষ্ট হয়ে গেছে বলে মনে হচ্ছে
22:38

28

তৃতীয় রূপ:

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

জাসননোড.ক্লাসে পাসিং আসলে এখানে এসেছিল কি?
ডেভিড

3
@ ডেভিড: কিছুই নয়, স্ল্যাশনিকের বৈকল্পিক স্পষ্টতই ভাল তবে যদি আপনি কেবল একটি চান JsonNode। যাইহোক, আপনি সাধারণত একটি চান না JsonNode, তাই আমি কীভাবে জ্যাকসনকে বলতে পারি যে আপনার কী ধরণের মান চান।
কেরুব

আমার পক্ষে, JsonNodeজ্যাকসনকে অন্য কিছু হিসাবে এটির বিশ্লেষণ থেকে আটকাতে স্পষ্টতই পাস করার প্রয়োজন ছিল - যা ব্যর্থ হত।
Cory Klein

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

জটিল বিষয়গুলির জন্য আরও পঠনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য। 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.