জ্যাকসন কীভাবে ingালাই ছাড়াই জসননোডকে অ্যারে নোডে রূপান্তর করবেন?


116

আমি আমার JSON গ্রন্থাগারটি org.json থেকে জ্যাকসনে পরিবর্তন করছি এবং আমি নিম্নলিখিত কোডটি স্থানান্তর করতে চাই:

JSONObject datasets = readJSON(new URL(DATASETS));
JSONArray datasetArray =  datasets.getJSONArray("datasets");

এখন জ্যাকসনে আমার নিম্নলিখিতগুলি রয়েছে:

ObjectMapper m = new ObjectMapper();
JsonNode datasets = m.readTree(new URL(DATASETS));      
ArrayNode datasetArray = (ArrayNode)datasets.get("datasets");

তবে আমি সেখানে castালাই পছন্দ করি না, এর কি সম্ভাবনা আছে ClassCastException? সেখানে একটি পদ্ধতি সমতূল্য getJSONArrayমধ্যে org.jsonযাতে আমি ক্ষেত্রে সঠিক ত্রুটি পরিচালনা আছে এটা একটি অ্যারের নয়?


দুর্ভাগ্যক্রমে আমি পূর্ণ ম্যাপিং ব্যবহার করতে পারি না কারণ ডেটা ক্ষেত্রের নাম স্থির করে না।
কনরাড হাফনার

1
যদি ক্ষেত্রের নামগুলি কোনও সীমিত সেট থেকে আসে তবে আপনি সেগুলির সমস্ত বৈশিষ্ট্যযুক্ত একটি শ্রেণীর সংজ্ঞা দিতে চাইতে পারেন, এবং FAIL_ON_UNKNOWN_PROPERTIESকেবল অব্যবহৃত ক্ষেত্রগুলিতে শূন্যস্থান ফিরে পেতে ডিসরিয়ালাইজারের বৈশিষ্ট্যটি ব্যবহার করতে পারেন । তবে অবশ্যই এটি কেবলমাত্র একটি বিকল্প যদি ক্ষেত্রের নাম সেটটি তুলনামূলকভাবে সীমাবদ্ধ থাকে।
fvu

এইচএম আমার মনে হয় এই সমাধানটি আমার ক্ষেত্রে সবচেয়ে বেশি ফিট করে না তবে আমি সীমিত সেট নিয়ে আগে থেকেই পরিচিত যা আমার যদি সমস্যা হয় তবে আমি তা মনে রাখব!
কনরাড হাফনার

উত্তর:


247

হ্যাঁ, জ্যাকসন ম্যানুয়াল পার্সার ডিজাইন অন্যান্য লাইব্রেরি থেকে বেশ আলাদা। বিশেষত, আপনি লক্ষ্য করবেন যে JsonNodeবেশিরভাগ ফাংশন রয়েছে যা আপনি সাধারণত অন্য এপিআই এর অ্যারে নোডগুলির সাথে যুক্ত করেন। এর মতো, আপনাকে ArrayNodeব্যবহারের জন্য কাস্ট করতে হবে না । এখানে একটি উদাহরণ:

তাদেরকে JSON:

{
    "objects" : ["One", "Two", "Three"]
}

কোড:

final String json = "{\"objects\" : [\"One\", \"Two\", \"Three\"]}";

final JsonNode arrNode = new ObjectMapper().readTree(json).get("objects");
if (arrNode.isArray()) {
    for (final JsonNode objNode : arrNode) {
        System.out.println(objNode);
    }
}

আউটপুট:

"এক"
"দুই"
"তিন"

isArrayপুনরাবৃত্তি করার আগে নোডটি আসলে একটি অ্যারে তা যাচাই করার জন্য ব্যবহারটি নোট করুন । আপনি যদি আপনার ড্যাটাস কাঠামোর প্রতি পুরোপুরি আত্মবিশ্বাসী হন তবে চেকটি প্রয়োজনীয় নয়, তবে এটির উপলভ্য আপনার প্রয়োজন হওয়া উচিত (এবং এটি অন্যান্য জেএসওএন লাইব্রেরি থেকে আলাদা নয়))


2
তুমি আমাকে ঘন্টা বাঁচিয়েছ ধন্যবাদ!
ইগোর মোরেইস

"চূড়ান্ত" জেসননোড অ্যাজেক্টনোড: আরনোড) "এর জন্য লাইনে কেন" চূড়ান্ত "ব্যবহার করা যাবে তা আমি জানতে পারি?
অ্যান্থনি বিনয়

5

জাভা 8 এ আপনি এটি এর মতো করতে পারেন:

import java.util.*;
import java.util.stream.*;

List<JsonNode> datasets = StreamSupport
    .stream(datasets.get("datasets").spliterator(), false)
    .collect(Collectors.toList())

1

Org.json এ জেএসএনআরএর সমতুল্য কোনও পদ্ধতি আছে যাতে এটি অ্যারে না হলে আমার সঠিক ত্রুটি পরিচালনা করতে হবে?

এটি আপনার ইনপুট উপর নির্ভর করে; অর্থাত্ ইউআরএল থেকে যে জিনিসগুলি আপনি এনেছেন তা। যদি "ডেটাসেটস" বৈশিষ্ট্যের মানটি একটি সরল অ্যারের পরিবর্তে একটি মিশ্র অ্যারে হয় তবে আপনি একটি পাবেন ClassCastException

কিন্তু তারপর আবার, আপনার পুরোনো সংস্করণ শুদ্ধি এছাড়াও ইনপুট উপর নির্ভর করে। আপনার নতুন সংস্করণটি এমন পরিস্থিতিতে ফেলেছে ClassCastException, পুরানো সংস্করণটি নিক্ষেপ করবে JSONException। তথ্যসূত্র: http://www.json.org/javadoc/org/json/JSONObject.html#getJSONArray(java.lang.String)


আহ ঠিক আছে তাই আমি কেবল একটি ক্লাসকাস্টএক্সেপশন ধরতে পারি, ধন্যবাদ! আমার স্বাদ জন্য এটি একটি নির্দিষ্ট জসনএক্সসেপশন থাকার চেয়ে কিছুটা কম মার্জিত তবে এটি যদি সম্ভব না হয় তবে তা এখনও ভাল।
কনরাড হাফনার

0

দিনের শেষে আমি ধরে নেব যে আপনি অ্যারে নোডে পুনরাবৃত্তি করে ডেটা গ্রাস করতে চান। যে জন্য:

Iterator<JsonNode> iterator = datasets.withArray("datasets").elements();
while (iterator.hasNext()) 
        System.out.print(iterator.next().toString() + " "); 

বা আপনি যদি স্ট্রিম এবং ল্যাম্বডা ফাংশনগুলিতে থাকেন তবে:

import com.google.common.collect.Streams;
Streams.stream(datasets.withArray("datasets").elements())
    .forEach( item -> System.out.print(item.toString()) )
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.