ক্ষেত্র প্রতি একাধিক জিএসএন @ সিরিয়ালাইজড নেম?


104

একক জাভা অবজেক্টের সদস্য ভেরিয়েবলে একাধিক জেএসওএন ক্ষেত্র ম্যাপ করার জন্য কি জিএসন-এ কোনও উপায় আছে?

ধরা যাক আমার একটি জাভা ক্লাস আছে ...

public class MyClass {
    String id;
    String name;
}

আমি এই একক ক্লাসটি দুটি ভিন্ন ভিন্ন পরিষেবা সহ ব্যবহার করতে চাই। যাইহোক, এই দুটি পরিষেবাদি কীভাবে তারা তাদের ডেটা ফিরিয়ে দেয় ...

{ "id": 2341, "person": "Bob" }

... এবং ...

{ "id": 5382, "user": "Mary" }

... যথাক্রমে

JSON স্ট্রিংয়ে জাভা অবজেক্টে ক্ষেত্রের সাথে ক্ষেত্র "person"এবং "user"ক্ষেত্র উভয়কেই ম্যাপ করার কোনও উপায় আছে name?

(দ্রষ্টব্য: আমাকে কেবল জেএসএন স্ট্রিং থেকে জাভা অবজেক্টে রূপান্তর করতে হবে - অন্যভাবে কখনও নয়))


1
এখানে সরল এবং নিখুঁত ব্যাখ্যা ভবিষ্যতের স্টুড.আইও
অতুল ভরদ্বাজ

উত্তর:


238

অক্টোবর 2015 সালে, Gson সংস্করণ 2.4 ( পরিবর্তণের ) জন্য ব্যবহারে বিকল্প / একাধিক নামের করার ক্ষমতা যোগ @SerializedNameযখন deserializing। আর কাস্টম টাইপএডাপ্টার প্রয়োজন নেই!

ব্যবহার:

@SerializedName(value="name", alternate={"person", "user"})

https://www.javadoc.io/doc/com.google.code.gson/gson/2.6.2/com/google/gson/annotations/SerializedName.html


1
এখানে সরল এবং নিখুঁত ব্যাখ্যা ভবিষ্যতের স্টুড.আই.ও.
অতুল ভরদ্বাজ

অ্যামেজিং! এই উত্তরের জন্য আপনাকে ধন্যবাদ!
সানলওভার

দুর্দান্ত উত্তর, ধন্যবাদ!
ডোর রড

27

এটি @SerializedNameজিসন-এর কোনও ক্ষেত্রে একাধিক টীকাগুলি সংজ্ঞায়িত করতে সমর্থ নয় ।

কারণ: ডিফল্টরূপে ডিসরিয়ালাইজেশন একটি লিংকডহ্যাশম্যাপ দ্বারা পরিচালনা করা হয় এবং কীগুলি আগত জসনের ক্ষেত্রের নামগুলি (কাস্টম শ্রেণীর ক্ষেত্রের নাম বা সিরিয়ালযুক্ত নাম নয়) দ্বারা সংজ্ঞায়িত করা হয় এবং সেখানে একের পর এক ম্যাপিং রয়েছে। আপনি বাস্তবায়ন (কিভাবে deserialization কাজ) দেখতে পারেন ReflectiveTypeAdapterFactoryক্লাস ভেতরের বর্গ Adapter<T>এর read(JsonReader in)পদ্ধতি।

সমাধান: আপনি একটি কাস্টম লিখতে পারেন TypeAdapter যা হ্যান্ডলগুলি name, personএবং userJSON ট্যাগ এবং তাদেরকে আপনার কাস্টম ক্লাসের নামের ক্ষেত্রে মানচিত্র MyClass:

class MyClassTypeAdapter extends TypeAdapter<MyClass> {

    @Override
    public MyClass read(final JsonReader in) throws IOException {
        final MyClass myClassInstance = new MyClass();

        in.beginObject();
        while (in.hasNext()) {
            String jsonTag = in.nextName();
            if ("id".equals(jsonTag)) {
                myClassInstance.id = in.nextInt();
            } else if ("name".equals(jsonTag) 
                    || "person".equals(jsonTag)
                    || "user".equals(jsonTag)) {
                myClassInstance.name = in.nextString();
            }
        }
        in.endObject();

        return myClassInstance;
    }

    @Override
    public void write(final JsonWriter out, final MyClass myClassInstance)
            throws IOException {
        out.beginObject();
        out.name("id").value(myClassInstance.id);
        out.name("name").value(myClassInstance.name);
        out.endObject();
    }
}

পরীক্ষা ক্ষেত্রে:

    String jsonVal0 = "{\"id\": 5382, \"user\": \"Mary\" }";
    String jsonVal1 = "{\"id\": 2341, \"person\": \"Bob\"}";

    final GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(MyClass.class, new MyClassTypeAdapter());
    final Gson gson = gsonBuilder.create();

    MyClass myClassInstance0 = gson.fromJson(jsonVal0, MyClass.class);
    MyClass myClassInstance1 = gson.fromJson(jsonVal1, MyClass.class);

    System.out.println("jsonVal0 :" + gson.toJson(myClassInstance0));
    // output: jsonVal0 :{"id":5382,"name":"Mary"}

    System.out.println("jsonVal1 :" + gson.toJson(myClassInstance1));
    // output: jsonVal1 :{"id":2341,"name":"Bob"}

TypeAdapters সম্পর্কে উদাহরণ।

২০১ Edit.০৪.০6 সম্পাদনা করুন: যেহেতু @ ম্যাথিয়ু বর্ণ তার উত্তর লিখেছেন, এটি এখন সমর্থিত। (এটি এই প্রশ্নের সঠিক উত্তর))

পাবলিক অ্যাবস্ট্রাক্ট স্ট্রিং [] বিকল্প
রিটার্নস: ক্ষেত্রটির বিকল্প নাম যখন এটি ডিজাইরিয়াল করা হয়
ডিফল্ট: {}


এখানে সরল এবং নিখুঁত ব্যাখ্যা ভবিষ্যতের স্টুড.আই.ও.
অতুল ভরদ্বাজ


8

কটলিনের জন্য আমি নীচে ব্যবহার করেছি তবে কাজ করে না

@SerializedName(value="name", alternate= ["person", "user"])

সুতরাং আমি এটি সম্পাদনা করেছি এবং এখানে এটি দুর্দান্ত কাজ করে !!

@SerializedName(value="name", alternate= arrayOf("person", "user"))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.