জসননোডকে পোজেও রূপান্তর করুন


143

এটি একটি সামান্য অস্বাভাবিক মনে হতে পারে, কিন্তু আমি একটি কার্যকর উপায় রুপান্তর / একটি ম্যাপ খোঁজ করছি JsonNodeএকটি মধ্যে POJO

আমি আমার মডেলের কিছু তথ্য জসন ফাইলগুলিতে সঞ্চয় করি এবং আমার মডেলের বেশ কয়েকটি সংস্করণ আমাকে সমর্থন করতে হয়।

আমি যা করি তা হল জসননোডে জেসন ফাইলটি মেমোরিতে লোড করা, এটি আমার মডেলের সর্বশেষতম সংস্করণের সাথে মেলে তুলতে বেশ কয়েকটি সংস্করণ কৌশল প্রয়োগ করুন।

    ObjectMapper mapper = new ObjectMapper();
    BufferedReader fileReader = new BufferedReader(new FileReader(projPath));

    JsonNode rootNode = mapper.readTree(fileReader);

    //Upgrade our file in memory
    applyVersioningStrategy(rootNode);

    ProjectModel project = mapJsonNodeToProject(rootNode);

এটি করার কোনও দ্রুত উপায় না হলে আমি সম্ভবত JsonNodesআমার মডেলটিতে ম্যানুয়ালি প্রয়োগ করব

উত্তর:


264

জ্যাকসন ২.৪-এ, আপনি নিম্নলিখিত রূপে রূপান্তর করতে পারেন:

MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);

যেখানে jsonObjectMapperএকটি জ্যাকসন ObjectMapper


জ্যাকসনের পুরানো সংস্করণগুলিতে এটি হবে

MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);

18
দুর্ভাগ্যক্রমে কোনও ট্রিটভ্যালু নেই (TreeNode n, TypeReferences <T> টাইপ) ভেরিয়েন্ট যেমন রিডভ্যালু () এর জন্য রয়েছে। জেনেরিকের সাথে আরও জটিল ধরণের কারও পক্ষে খারাপ খবর :(
এস্পিনোসা

13
@ এস্পিনোসা পার জ্যাকসন -ডেটাবিন্ড # 1294 , আপনি এমন কিছু চাইবেন (দুর্ভাগ্যক্রমে আরও ভার্জোজ)jsonObjectMapper.readValue(jsonObjectMapper.treeAsTokens(someJsonNode), someTypeReference)
এম জাস্টিন

পুরানো সংস্করণ ব্যবহারের জন্য:objectMapper.treeToValue(jsonNode, MyClass.class)
২৪

2
এছাড়াও আপনি StdDeserializer এই পদ্ধতি ব্যবহার করতে পারেন: p.codec.treeToValue
গ্যালসিউরিও

@icedtree jsonObjectMapper হ'ল JsonObjectMapper বা কেবলমাত্র ObjectMapper
কেঁধিরজ

8

এই কৌতুক করতে হবে:

mapper.readValue(fileReader, MyClass.class);

আমি বলি কারণ আমি এটি একটি দিয়ে ব্যবহার করছি String, এটি নয় BufferedReaderতবে এটি এখনও কাজ করা উচিত।

আমার কোডটি এখানে:

String inputString = // I grab my string here
MySessionClass sessionObject;
try {
    ObjectMapper objectMapper = new ObjectMapper();
    sessionObject = objectMapper.readValue(inputString, MySessionClass.class);

এই কলটির জন্য এখানে অফিসিয়াল ডকুমেন্টেশন রয়েছে: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(java.lang.String, java.lang.Class)

যখন আপনি instantiate এছাড়াও আপনি একটি কাস্টম deserializer বর্ণনা করতে পারেন ObjectMapper: http://wiki.fasterxml.com/JacksonHowToCustomDeserializers

সম্পাদনা: আমার আর কিছু মনে আছে। আপনার অবজেক্টে যদি আসার চেয়ে বেশি বৈশিষ্ট্য থাকে POJOএবং আপনি কেবল অতিরিক্তটি সেট করতে চান তবে আপনি এটি সেট করতে চান:

    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

অথবা আপনি একটি ত্রুটি পাবেন যা এটি সেট করার জন্য সম্পত্তিটি খুঁজে পাবে না।


আমি একটি কাস্টমডিজারাইজার ব্যবহার করব, এটি আমাকে অনেক মাথাব্যথা বাঁচাতে পারবে! আমি সেখানে আমার সংস্করণ কৌশলগুলি খুব অল্প সংশোধন করে প্রয়োগ করতে সক্ষম হব। ধন্যবাদ!
আলেকজান্দ্রে

5
সিনট্যাক্সটি এখন: com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper (); mapper.disable (com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
llambda

ভাল পয়েন্ট @ ল্ল্যাম্বদা! সংস্করণ ১.7.৯ থেকে আমি অবজেক্টম্যাপারটি স্পর্শ করি নি, দেখে মনে হচ্ছে কয়েকটি উত্তর অনুসারে আমার উত্তর পুরানো। আপনি জ্যাকসনের কোন সংস্করণ ব্যবহার করছেন তা অবশ্যই পরীক্ষা করুন।
এরিক বার

@ এরিকবার, আমি জ্যাকসন v1.9.11 ব্যবহার করছি এবং আপনার উত্তরের বাক্য গঠনটি সেই সংস্করণের জন্য সঠিক। সম্ভবত তারা জিনিসগুলি পরিবর্তনের চেষ্টা করেছিল এবং নতুন সংস্করণগুলিতে তাদের আবার ফিরিয়ে দিয়েছে
Ivaylo Slavov

5

আপনি যদি org.codehaus.jackson ব্যবহার করছেন তবে এটি 1.6 সাল থেকে সম্ভব হয়েছে। আপনি একটি জসননোডকে একটি পজোতে রূপান্তর করতে পারেন ObjectMapper#readValue: http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(org.codehaus.jackson.JsonNode , java এর সাথে। lang.Class)


    ObjectMapper mapper = new ObjectMapper();
    JsonParser jsonParser = mapper.getJsonFactory().createJsonParser("{\"foo\":\"bar\"}");
    JsonNode tree = jsonParser.readValueAsTree();
    // Do stuff to the tree
    mapper.readValue(tree, Foo.class);

5
এই পদ্ধতিগুলি
2.4.4 এ

1
সংস্করণ 2 সমাধানের জন্য নীচে আইসড্রি-এর উত্তর দেখুন
টিম বাথ


3
String jsonInput = "{ \"hi\": \"Assume this is the JSON\"} ";
com.fasterxml.jackson.databind.ObjectMapper mapper =
    new com.fasterxml.jackson.databind.ObjectMapper();
MyClass myObject = objectMapper.readValue(jsonInput, MyClass.class);

যদি আপনার জেএসওএন ইনপুটটিতে আপনার পোজোর চেয়ে আরও বেশি বৈশিষ্ট্য রয়েছে এবং আপনি কেবল জ্যাকসন ২.৪-এ অতিরিক্তগুলি উপেক্ষা করতে চান, আপনি নীচে আপনার অবজেক্টম্যাপারটি কনফিগার করতে পারেন। এই সিনট্যাক্সটি পুরানো জ্যাকসনের সংস্করণ থেকে পৃথক। (আপনি যদি ভুল বাক্য গঠন ব্যবহার করেন তবে তা নিঃশব্দে কিছুই করবে না))

mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNK‌​NOWN_PROPERTIES);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.