জাসন অ্যারে java.util. মধ্যে তালিকাভুক্ত করা হয়েছে। গসনের সাথে তালিকায় রাখুন


119

নিম্নলিখিত কন্টেন্ট সহ আমার একটি JsonObjectনাম "mapping"রয়েছে:

{
    "client": "127.0.0.1",
    "servers": [
        "8.8.8.8",
        "8.8.4.4",
        "156.154.70.1",
        "156.154.71.1"
    ]
}

আমি জানি আমি এর "servers"সাথে অ্যারে পেতে পারি :

mapping.get("servers").getAsJsonArray()

এবং এখন আমি এটি JsonArrayএকটি পার্স করতে চান java.util.List...

এই কাজ করতে সবচেয়ে সহজ পদ্ধিতি হল উপায় কি?



2
@ আরখ এই প্রশ্নটির মধ্যে অনেক পার্থক্য রয়েছে। এই এক সাথে ডিল Gson
আবেল কালেজো

@ আবেলমেলকিউইডস কালেজো উত্তরটির দিকে একবার নজর রাখবেন I আমি আশা করি এটি আপনার সমস্যার সমাধান করবে।
পূর্বক

@রুখ হ্যাঁ আমি আপনার সাথে একমত এবং আমি JsonArrayপ্রয়োগগুলি জানি Iterable। এটি কেবলমাত্র আমি একটি নতুন লাইব্রেরি যুক্ত করা ছাড়াও নতুন উপায়গুলি সন্ধান করছি।
আবেল কালেজো

উত্তর:


273

অবশ্যই এটি করার সহজতম উপায় হ'ল জিসনের ডিফল্ট পার্সিং ফাংশনটি ব্যবহার করা fromJson()

আপনার যখন কোনও ParameterizedType(যেমন, কোনও List), যা ডিসরিয়ালাইজ করা দরকার তখন উপযুক্ত এই ফাংশনের একটি বাস্তবায়ন রয়েছে fromJson(JsonElement json, Type typeOfT)

আপনার যদি, আপনি শুধু পেতে প্রয়োজন Typeএকটি এর List<String>এবং তারপর যে মধ্যে তাদেরকে JSON অ্যারের পার্স Type, এভাবে:

import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;

JsonElement yourJson = mapping.get("servers");
Type listType = new TypeToken<List<String>>() {}.getType();

List<String> yourList = new Gson().fromJson(yourJson, listType);

আপনার ক্ষেত্রে yourJsonএটি একটি JsonElementতবে এটি একটি String, যে কোনও Readerবা একটিও হতে পারে JsonReader

আপনি জিএসএন এপিআই ডকুমেন্টেশন একবার দেখে নিতে পারেন ।


7
Typeকোন প্যাকেজে পাওয়া যাবে?
আবেল কালেজো

10
Typeপ্যাকেজে থাকা জাভা অন্তর্নির্মিত ইন্টারফেসjava.lang.reflect
মাইকো

আমাকে অভিযোগ করা বা getString()পরিবর্তে ব্যবহার get()করতে .fromJson()হয়েছিল।
লেনোহ

@ মিকো আমার এখানে জিসনের সাথে একই ধরণের প্রশ্ন রয়েছে । আপনি আমাকে সাহায্য করতে পারেন কিনা তা আমি দেখতে চেয়েছিলাম। আমার কাছে একটি সমাধান আছে তবে সমস্যাটি হ'ল কেবল কোনও মানচিত্রে একটি জেএসএনকে পার্স করার জন্য খুব অগোছালো দেখাচ্ছে।
জন

18

নীচে কোড ব্যবহার করা হয় com.google.gson.JsonArray। আমি তালিকায় থাকা উপাদানগুলির পাশাপাশি তালিকার উপাদানগুলিও মুদ্রণ করেছি

import java.util.ArrayList;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;


public class Test {

    static String str = "{ "+ 
            "\"client\":\"127.0.0.1\"," + 
            "\"servers\":[" + 
            "    \"8.8.8.8\"," + 
            "    \"8.8.4.4\"," + 
            "    \"156.154.70.1\"," + 
            "    \"156.154.71.1\" " + 
            "    ]" + 
            "}";

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {

            JsonParser jsonParser = new JsonParser();
            JsonObject jo = (JsonObject)jsonParser.parse(str);
            JsonArray jsonArr = jo.getAsJsonArray("servers");
            //jsonArr.
            Gson googleJson = new Gson();
            ArrayList jsonObjList = googleJson.fromJson(jsonArr, ArrayList.class);
            System.out.println("List size is : "+jsonObjList.size());
                    System.out.println("List Elements are  : "+jsonObjList.toString());


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

আউটপুট

List size is : 4

List Elements are  : [8.8.8.8, 8.8.4.4, 156.154.70.1, 156.154.71.1]

8

আমি এখানে জিসনের অফিসিয়াল ওয়েবসাইট থেকে সমাধানটি পড়ি

এবং আপনার জন্য এই কোড:

    String json = "{"client":"127.0.0.1","servers":["8.8.8.8","8.8.4.4","156.154.70.1","156.154.71.1"]}";

    JsonObject jsonObject = new Gson().fromJson(json, JsonObject.class);
    JsonArray jsonArray = jsonObject.getAsJsonArray("servers");

    String[] arrName = new Gson().fromJson(jsonArray, String[].class);

    List<String> lstName = new ArrayList<>();
    lstName = Arrays.asList(arrName);

    for (String str : lstName) {
        System.out.println(str);
    }    

মনিটরে ফলাফল শো:

8.8.8.8
8.8.4.4
156.154.70.1
156.154.71.1

উপরের মত একই উত্তর - এখনও স্থির পদ্ধতি ব্যবহার করেnew Gson().fromJson()
আবেল ক্লেলেজো

ভাল আমার সমস্যা অন্য ছিল কিন্তু আপনার স্নিপেট আমার সমস্যা সমাধান। আমি স্ট্রিংয়ের তালিকা সংরক্ষণ করেছি তবে আমি স্ট্রিংগুলি আনতে চাই। তারপরে আপনার স্নিপেটটি তাদের স্মরণ করিয়ে দেয় আমি তথ্য আনতে স্ট্রিং []। ক্লাস রাখতে পারি। আপনাকে ধন্যবাদ
বদরশাহাদাদ

2

আমি কেবলমাত্র @SerializedNameসমস্ত ক্ষেত্রের জন্য ব্যবহার করে তালিকার ম্যাপিংয়ের সাথে কাজ করতে সক্ষম হয়েছি .. আশেপাশে কোনও যুক্তি Typeপ্রয়োজন হয়নি।

কোডটি চালাচ্ছি - নীচে # 4-পদক্ষেপে - ডিবাগারের মাধ্যমে, আমি পর্যবেক্ষণ করতে সক্ষম হয়েছি যে List<ContentImage> mGalleryImagesজেএসএন ডেটার সাহায্যে অবজেক্টটি পপুলেট হয়েছে

এখানে একটি উদাহরণ:

1. জেএসএন

   {
    "name": "Some House",
    "gallery": [
      {
        "description": "Nice 300sqft. den.jpg",
        "photo_url": "image/den.jpg"
      },
      {
        "description": "Floor Plan",
        "photo_url": "image/floor_plan.jpg"
      }
    ]
  }

2. তালিকা সহ জাভা ক্লাস

public class FocusArea {

    @SerializedName("name")
    private String mName;

    @SerializedName("gallery")
    private List<ContentImage> mGalleryImages;
}

৩. তালিকার আইটেমগুলির জন্য জাভা ক্লাস

public class ContentImage {

    @SerializedName("description")
    private String mDescription;

    @SerializedName("photo_url")
    private String mPhotoUrl;

    // getters/setters ..
}

৪. জাভা কোড যা JSON প্রসেস করে

    for (String key : focusAreaKeys) {

        JsonElement sectionElement = sectionsJsonObject.get(key);
        FocusArea focusArea = gson.fromJson(sectionElement, FocusArea.class);
    }

0

আপনাকে দিয়ে শুরু করা mapping.get("servers").getAsJsonArray(), যদি আপনার পেয়ারা অ্যাক্সেস থাকে তবে আপনি Streamsনীচের ওয়ান- লাইনারটি করতে পারেন:

List<String> servers = Streams.stream(jsonArray.iterator())
                              .map(je -> je.getAsString())
                              .collect(Collectors.toList());

নোট প্রকারভেদে StreamSupportকাজ করতে সক্ষম হবে না JsonElement, সুতরাং এটি অপর্যাপ্ত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.