গুগল জিসন - << ক্লাস> অবজেক্টের ডিসরিয়ালাইজ করবেন? (জেনেরিক প্রকার)


441

আমি গুগল জিসনের মাধ্যমে একটি তালিকা বস্তু স্থানান্তর করতে চাই, তবে জেনেরিক প্রকারগুলি কীভাবে deserialize করা যায় তা আমি জানি না।

আমি কি এ খুঁজছেন পরে চেষ্টা এই (BalusC এর উত্তর):

MyClass mc = new Gson().fromJson(result, new List<MyClass>(){}.getClass());

তবে আমি গ্রহনের ক্ষেত্রে একটি ত্রুটি পেয়েছি "টাইপ নতুন তালিকার ({} অবশ্যই উত্তরাধিকারসূত্রে বিমূর্ত পদ্ধতিটি প্রয়োগ করতে হবে ..." এবং যদি আমি একটি দ্রুত ফিক্স ব্যবহার করি তবে আমি 20 টিরও বেশি পদ্ধতির স্টাবের দৈত্য পাব।

আমি আরও নিশ্চিত যে এর আরও সহজ সমাধান আছে তবে আমি এটি খুঁজে পেতে অক্ষম!

সম্পাদনা:

এখন আমার আছে

Type listType = new TypeToken<List<MyClass>>()
                {
                }.getType();

MyClass mc = new Gson().fromJson(result, listType);

যাইহোক, আমি "জেসন থেকে" লাইনে নিম্নলিখিত ব্যতিক্রমগুলি পাই:

java.lang.NullPointerException
at org.apache.harmony.luni.lang.reflect.ListOfTypes.length(ListOfTypes.java:47)
at org.apache.harmony.luni.lang.reflect.ImplForType.toString(ImplForType.java:83)
at java.lang.StringBuilder.append(StringBuilder.java:203)
at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDeserializerExceptionWrapper.java:56)
at com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer(JsonDeserializationVisitor.java:88)
at com.google.gson.JsonDeserializationVisitor.visitUsingCustomHandler(JsonDeserializationVisitor.java:76)
at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:106)
at com.google.gson.JsonDeserializationContextDefault.fromJsonArray(JsonDeserializationContextDefault.java:64)
at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:49)
at com.google.gson.Gson.fromJson(Gson.java:568)
at com.google.gson.Gson.fromJson(Gson.java:515)
at com.google.gson.Gson.fromJson(Gson.java:484)
at com.google.gson.Gson.fromJson(Gson.java:434)

আমি কি করতে ধরা JsonParseExceptions এবং "RESULT" নাল নয়।

আমি ডিবাগারটির সাথে তালিকাটি টাইপ চেক করেছি এবং নিম্নলিখিতগুলি পেয়েছি:

  • তালিকার প্রকার
    • আরগস = লিস্টঅফটাইপস
      • list = নাল
      • সমাধানযুক্ত প্রকার = প্রকার [1]
    • লোডার = PathClassLoader
    • মালিকের টাইপ 0 = নাল
    • মালিকের টাইপরেস = নাল
    • কাঁচা টাইপ = শ্রেণি (java.util.ArrayList)
    • RawTypeName = "java.util.ArrayList"

সুতরাং মনে হচ্ছে "getClass" অনুরোধটি সঠিকভাবে কাজ করে নি। কোন পরামর্শ...?

সম্পাদনা 2: আমি জিএসন ব্যবহারকারী নির্দেশিকাতে পরীক্ষা করেছি । এটি একটি রানটাইম ব্যতিক্রম উল্লেখ করেছে যা জসনকে জেনেরিক ধরণের পার্সিংয়ের সময় হওয়া উচিত। উদাহরণ হিসাবে যেমন আমি এটি "ভুল" করেছি (উপরে দেখানো হয়নি) তবে ব্যতিক্রমটি মোটেই পেলাম না। সুতরাং আমি ব্যবহারকারী নির্দেশিত অনুসারে সিরিয়ালাইজেশন পরিবর্তন করেছি। সাহায্য করেনি, যদিও।

সম্পাদনা 3: সমাধান হয়েছে, নীচে আমার উত্তর দেখুন।


1
আপনি যে উত্তরটি নির্দেশ করেছেন, তা ব্যবহার করে TokenType। আপনি কি সেভাবে চেষ্টা করেছেন?
নিশান্ত

উত্তর হিসাবে একই ইঙ্গিত পেয়েছি। পরের বার আমি উদাহরণটি আরও কাছ থেকে দেখব। ;)
জেলিফিশ

আপনি কি টাইপ টোকনে তালিকার একটি প্রয়োগের চেষ্টা করতে পারেন? আপনার কাঁচা টাইপ অ্যারে তালিকা হওয়ায় আপনার অ্যারে তালিকাটি চেষ্টা করা উচিত।
uncaught_exferences 13

উত্তর:


954

জেনেরিক সংগ্রহকে deserialize করার পদ্ধতি:

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

...

Type listType = new TypeToken<ArrayList<YourClass>>(){}.getType();
List<YourClass> yourClassList = new Gson().fromJson(jsonArray, listType);

যেহেতু মন্তব্যে বেশিরভাগ লোক এটি উল্লেখ করেছে, TypeTokenক্লাসটি কীভাবে ব্যবহৃত হচ্ছে তার একটি ব্যাখ্যা এখানে । নির্মাণ new TypeToken<...>() {}.getType()একটি কম্পাইল-টাইম (মধ্যে টাইপ ধারন করে <এবং >) একটি রানটাইম মধ্যে java.lang.reflect.Typeঅবজেক্ট। কোনও Classবস্তুর বিপরীতে , যা কেবলমাত্র একটি কাঁচা (মুছে ফেলা) প্রকারের Typeপ্রতিনিধিত্ব করতে পারে , বস্তুটি জেনেরিক ধরণের একটি প্যারামিটারাইজড ইনস্ট্যান্টেশন সহ জাভা ভাষায় যে কোনও প্রকারের প্রতিনিধিত্ব করতে পারে।

TypeTokenকারণ আপনি এটি সরাসরি গঠন করা অনুমিত করছি না বর্গ নিজেই একটি সর্বজনীন কন্সট্রাকটর নেই। পরিবর্তে, আপনি সর্বদা একটি বেনামে সাবক্লাস নির্মাণ করেন (অতএব {}, যা এই অভিব্যক্তির প্রয়োজনীয় অংশ)।

টাইপ ইরেজরের কারণে, TypeTokenক্লাসটি কেবল এমন টাইপগুলি ক্যাপচার করতে সক্ষম যা সংকলনের সময় পুরোপুরি পরিচিত। (এটি, আপনি new TypeToken<List<T>>() {}.getType()কোনও টাইপ প্যারামিটারের জন্য করতে পারবেন না T))

আরও তথ্যের জন্য, TypeTokenক্লাসের জন্য ডকুমেন্টেশন দেখুন ।


31
জিএসএন-র নতুন সংস্করণে টাইপটোকেন কনট্রাক্টরটি সর্বজনীন নয়, সুতরাং এখানে আপনি কনস্ট্রাক্টরকে দৃশ্যমান ত্রুটি দেখা যায় না। এক্ষেত্রে আপনাকে কী করতে হবে?
পাবলো

8
GSON এর প্রকৃত সংস্করণ ব্যবহার করে (২.২.৪) এটি আবার কাজ করে। আপনি এখানে কনস্ট্রাক্টর অ্যাক্সেস করতে পারেন।

আমার জেএসন অবজেক্টটি কোনও অবজেক্টের সাথে শুরু হয়, তারপরে আমি যে অবজেক্টটি চাই তার একটি অ্যারে ধারণ করে { "myObjectArray":[ {....} , {....} , {....} ] }, আমি মডেল ফাইলটি তৈরি করেছি, আমি {....}কীভাবে এই জেনেরিক সংগ্রহ কোডটি পাব না যে আমার মূল উপাদানটি একটি নতুন নেস্টেড অবজেক্ট ফাইল তৈরি না করেই অ্যারে হয়?
CQM

7
আমদানিগুলি অনুসরণ করা প্রয়োজন --- আমদানি করুন java.lang.reflect.Type; com.google.gson.reflect.TypeToken
উমায়ের সালেম

4
আপনার ক্লাস কোডে ঠিক করা থাকলে এটি ভাল। ক্লাস রানটাইমে এলে কী হয়?
jasxir

273

আরেকটি উপায় হ'ল একটি অ্যারেটিকে ধরণ হিসাবে ব্যবহার করা, যেমন:

MyClass[] mcArray = gson.fromJson(jsonString, MyClass[].class);

আপনি টাইপ অবজেক্টটি সহ সমস্ত ঝামেলা এড়াতে পারেন এবং যদি আপনার সত্যিই একটি তালিকার প্রয়োজন হয় তবে আপনি সর্বদা অ্যারেটিকে একটি তালিকায় রূপান্তর করতে পারেন:

List<MyClass> mcList = Arrays.asList(mcArray);

আইএমএইচও এটি আরও পাঠযোগ্য।

এবং এটিকে আসল তালিকায় পরিণত করার জন্য (যা সংশোধন করা যায়, এর সীমাবদ্ধতাগুলি দেখুন Arrays.asList()) তবে নিম্নলিখিতগুলি করুন:

List<MyClass> mcList = new ArrayList<>(Arrays.asList(mcArray));

4
এটা অসাধারণ! আমি কীভাবে এটি প্রতিবিম্ব সহ ব্যবহার করতে পারি? আমি MyClassমান জানি না এবং এটি গতিশীলভাবে সংজ্ঞায়িত করা হবে!
আমিন শ

1
নোটা: এটির সাথে, সতর্কতা অবলম্বন করুন যে এমসিএলিস্ট একটি পূর্ণাঙ্গ তালিকা নয়। অনেক কিছুই কাজ করবে না।
njzk2

4
জেনেরিক দিয়ে এটি কীভাবে ব্যবহার করবেন? T[] yourClassList = gson.fromJson(message, T[].class);// প্রকারের পরিবর্তনশীল থেকে নির্বাচন করতে পারে না
পাভেল সিওচ

2
mcListএই মন্তব্যের সময় @ ম্যাটিউস ভিচারি, এই উত্তরে কেবলমাত্র ডেকে আনা ফলাফল Arrays.asList। এই পদ্ধতিটি এমন একটি তালিকা প্রত্যাখ্যান করে যার উপর সর্বাধিক যদি সমস্ত alচ্ছিক পদ্ধতি অবহিত না হয় এবং ব্যতিক্রম ছুঁড়ে ফেলে। উদাহরণস্বরূপ, আপনি সেই তালিকায় কোনও উপাদান যুক্ত করতে পারবেন না। পরবর্তী সম্পাদনার পরামর্শ অনুসারে, Arrays.asListএর সীমাবদ্ধতা রয়েছে এবং এটিকে আসল আকারে মোড়ানো ArrayListআপনাকে এমন একটি তালিকা পেতে দেয় যা অনেক ক্ষেত্রেই বেশি কার্যকর।
njzk2

2
যদি আপনাকে একটি স্বেচ্ছাসেবী উপাদান টাইপের জন্য রানটাইমের সময় একটি অ্যারে টাইপ তৈরি করতে হয়, আপনি ডেভিড উডের উত্তরেArray.newInstance(clazz, 0).getClass() বর্ণিত হিসাবে ব্যবহার করতে পারেন ।
ড্যানিয়েল প্রাইডেন

31

এই পোস্টে দেখুন। GSON এর পক্ষে আর্গুমেন্ট হিসাবে জাভা টাইপ জেনেরিক

আমি এই জন্য আরও ভাল সমাধান আছে। তালিকার জন্য মোড়কের ক্লাসটি এখানে রয়েছে যাতে মোড়কটি সঠিক ধরণের তালিকাকে সঞ্চয় করতে পারে।

public class ListOfJson<T> implements ParameterizedType
{
  private Class<?> wrapped;

  public ListOfJson(Class<T> wrapper)
  {
    this.wrapped = wrapper;
  }

  @Override
  public Type[] getActualTypeArguments()
  {
      return new Type[] { wrapped };
  }

  @Override
  public Type getRawType()
  {
    return List.class;
  }

  @Override
  public Type getOwnerType()
  {
    return null;
  }
}

এবং তারপরে কোডটি সহজ হতে পারে:

public static <T> List<T> toList(String json, Class<T> typeClass)
{
    return sGson.fromJson(json, new ListOfJson<T>(typeClass));
}

কী mEntity.rulePattern?
আল লেলোপাথ

এটি পরীক্ষার জন্য একটি নমুনা অবজেক্ট। আপনার এটি সম্পর্কে যত্ন নেওয়ার দরকার নেই। টুলিস্ট পদ্ধতিটি ব্যবহার করুন এবং সবকিছু ঠিকঠাক হয়।
হ্যাপিয়ার

@ হ্যাপিয়ার আমি এই জিএসন ২.৮.২ বাস্তবায়নের চেষ্টা করছি এবং মনে হচ্ছে এটি কার্যকর হয়নি। যে কোনও সুযোগসই স্ট্যাকওভারফ্লো.com/ জিজ্ঞাসা / 74০7439৯৯32৩২/২ আপনি একবার দেখে নিতে পারেন এবং আমি কী অনুপস্থিত তা আমাকে জানাতে পারেন
প্রবীণ

1
@ প্রবীণ আমি ২.৮.২ তে এইভাবে চেষ্টা করেছি, এটি মূল হিসাবে কাজ করে।
হ্যাপিয়ার

31

যেহেতু Gson 2.8, আমরা ব্যবহারের মতো ফাংশন তৈরি করতে পারি

public <T> List<T> getList(String jsonArray, Class<T> clazz) {
    Type typeOfT = TypeToken.getParameterized(List.class, clazz).getType();
    return new Gson().fromJson(jsonArray, typeOfT);
}

ব্যবহার উদাহরণ

String jsonArray = ...
List<User> user = getList(jsonArray, User.class);

2
TypeToken#getParameterizedবেনামে সাবক্লাস সহ হ্যাকের পরে আরও ভাল উপায় দেখায়
নিকোলে কুলাঞ্চনো

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত; কমপক্ষে আরও নতুন সংস্করণগুলির জন্য
সিসিপিজ্জা

2
এটি সঠিক উত্তর। আমার সমস্যা সমাধান করে
donmj

আমি আপনার পদ্ধতিটি "যেমন রয়েছে" অনুলিপি করেছি এবং এটি কার্যকর হয় না: সংকলকটি বলে "পদ্ধতিটি getParameterized (Class <List>, Class <T>) টাইপটোকেন টাইপের জন্য অপরিজ্ঞাত"। আমি আমার জিসন সংস্করণ (২.৮.০) এবং ডকুমেন্টেশন উভয়টিই যাচাই করেছিলাম এবং এই দিকে সবকিছু ঠিক আছে ... আমি @ হ্যাপিয়ার সমাধানটি ব্যবহার করে শেষ করেছি যা সূক্ষ্মভাবে কাজ করে
লেজুমিনেটর

আপনি কি টাইপটোকেন সঠিকভাবে আমদানি করেছেন? এবং আপনি জাভা বা কোটলিন ব্যবহার করছেন। আমি আবার পরীক্ষা করার চেষ্টা করব
ফান ভ্যান লিনহ

26

ওয়েপ, একই ফলাফল অর্জনের অন্য উপায়। আমরা এটির পাঠযোগ্যতার জন্য এটি ব্যবহার করি।

হার্ড-টু-পঠিত বাক্যটি না করে:

Type listType = new TypeToken<ArrayList<YourClass>>(){}.getType();
List<YourClass> list = new Gson().fromJson(jsonArray, listType);

একটি খালি শ্রেণি তৈরি করুন যা আপনার অবজেক্টের একটি তালিকা বাড়ায়:

public class YourClassList extends ArrayList<YourClass> {}

এবং JSON পার্স করার সময় এটি ব্যবহার করুন:

List<YourClass> list = new Gson().fromJson(jsonArray, YourClassList.class);

9

কোটলিনের জন্য কেবল:

import java.lang.reflect.Type
import com.google.gson.reflect.TypeToken
...
val type = object : TypeToken<List<T>>() {}.type

বা, এখানে একটি দরকারী ফাংশন:

fun <T> typeOfList(): Type {
    return object : TypeToken<List<T>>() {}.type
}

তারপরে, ব্যবহার করতে:

val type = typeOfList<YourMagicObject>()

আমি আপনার কোডটি সংশোধিত প্রকারগুলি ব্যবহার করে এই ফাংশনটি তৈরি করতে ব্যবহার করেছি: inline fun <reified T> buildType() = object : TypeToken<T>() {}.type!!এবং তালিকার ধরণের মাধ্যমে এটি কল করুন:buildType<List<YourMagicObject>>()
কফিম্যাকার

@ কফিম্যাকার আপনার এখানে পুনরায় সংশোধিত প্রকারের দরকার নেই।
চাদ বিংহাম

উহু. তবে আপনি কেন একটি অ্যারেলিস্টের প্রকারের টোকেন তৈরি করেন buildTypeএবং জেনেরিক টাইপের সাথে ফাংশনটি কল করেন? এটি কি টাইপো? - এই ArrayList <ArrayList <YourMagicObject >> তৈরি করবে
coffeemakr

@ কফিমাকর আহ, হ্যাঁ টাইপো
চাদ বিংহাম

7
public static final <T> List<T> getList(final Class<T[]> clazz, final String json)
{
    final T[] jsonToObject = new Gson().fromJson(json, clazz);

    return Arrays.asList(jsonToObject);
}

উদাহরণ:

getList(MyClass[].class, "[{...}]");

ভাল একটা. তবে এই DevNGউপরের উত্তরটির সদৃশ , 2 বছর আগে লিখিত: স্ট্যাকওভারফ্লো.com / a / 17300003 / 1339923 (এবং এই পদ্ধতির প্রতি সতর্কতার জন্য সেই উত্তরটি পড়ুন)
ল্যাম্বার্ট

6

এটি আমার আসল প্রশ্নের উত্তর হিসাবে, আমি ডক ৮৮০ এর উত্তর গ্রহণ করেছি, তবে যদি কেউ আবার এই সমস্যায় পড়ে তবে আমি আমার প্রশ্নের ২ য় অর্ধেক উত্তরও দেব:

আমি উল্লিখিত নালপয়েন্টার এররটির তালিকাগুলির সাথে কোনও সম্পর্ক নেই, তবে এর সামগ্রীর সাথে!

"মাইক্লাস" শ্রেণিতে "নো অর্গস" কনস্ট্রাক্টর ছিল না এবং এর সুপারক্লাসটিও ছিল না। একবার আমি মাইক্লাস এবং এর সুপারক্লাসে একটি সাধারণ "মাইক্লাস ()" কনস্ট্রাক্টর যুক্ত করেছি, ডেস্ক_180 এর পরামর্শ অনুসারে তালিকা সিরিয়ালাইজেশন এবং ডেসারিয়ালাইজেশন সহ সবকিছু ঠিকঠাক কাজ করেছে।


1
আপনার যদি বিমূর্ত ক্লাসগুলির একটি তালিকা থাকে তবে আপনি একই ত্রুটি পাবেন। আমার অনুমান "ক্লাস ইনস্ট্যান্ট করতে অক্ষম" এর জন্য এটি জিএসওনের সাধারণ ত্রুটি বার্তা।
ড্র হয়েছে

কনস্ট্রাক্টর যুক্ত করার টিপটি আমাকে বুঝতে পেরেছিল যে আমার কাছে কেন সমস্ত নাল-মান রয়েছে। আমার জেএসওএন-স্ট্রিংয়ে আমার কাছে "টু" এবং "থেকে" এর মতো ফিল্ডের নাম ছিল, তবে আমার অবজেক্টের সংশ্লিষ্ট ক্ষেত্রগুলি "নিম্ন" ক্ষেত্রে "থেকে" এবং "থেকে" ছিল, তাই সেগুলি এড়িয়ে গেছে
রুন

4

এখানে একটি সমাধান যা গতিশীল সংজ্ঞায়িত প্রকারের সাথে কাজ করে। কৌশলটি অ্যারে.নিউইইনস্ট্যানস () ব্যবহার করে যথাযথ ধরণের অ্যারে তৈরি করছে।

    public static <T> List<T> fromJsonList(String json, Class<T> clazz) {
    Object [] array = (Object[])java.lang.reflect.Array.newInstance(clazz, 0);
    array = gson.fromJson(json, array.getClass());
    List<T> list = new ArrayList<T>();
    for (int i=0 ; i<array.length ; i++)
        list.add(clazz.cast(array[i]));
    return list; 
}

এই উত্তরটি আরও ভাল হবে যদি আপনি class.cast()কাস্টিং দ্বারা সৃষ্ট চেক করা সতর্কতা এড়াতে ব্যবহার করেন (T)। অথবা, আরও ভাল, কাস্টিং নিয়ে বিরক্ত করবেন না এবং Arrays.asList()অ্যারে থেকে এ এ রূপান্তর করার মতো কিছু ব্যবহার করুন List<T>। এছাড়াও, এর জন্য কোনও দৈর্ঘ্য অতিক্রম করার দরকার নেই Array.newInstance()- আকারের শূন্যের অ্যারে কল করার জন্য যথেষ্ট ভাল getClass()
ড্যানিয়েল প্রাইডেন

পরামর্শের জন্য ধন্যবাদ, আমি আপনার প্রস্তাবিত পরিবর্তনগুলি করেছি এবং উপরের পোস্টটি আপডেট করেছি।
ডেভিড উড

2

আমি আরও একটি সম্ভাবনার যোগ করতে চাই। আপনি যদি টাইপটোকেন ব্যবহার করতে না চান এবং জসন অবজেক্টস অ্যারেটিকে অ্যারেলিস্টে রূপান্তর করতে চান, তবে আপনি এইভাবে এগিয়ে যেতে পারেন:

যদি আপনার জসন কাঠামোটি এর মতো হয়:

{

"results": [
    {
        "a": 100,
        "b": "value1",
        "c": true
    },
    {
        "a": 200,
        "b": "value2",
        "c": false
    },
    {
        "a": 300,
        "b": "value3",
        "c": true
    }
]

}

এবং আপনার শ্রেণি কাঠামোটি হ'ল:

public class ClassName implements Parcelable {

    public ArrayList<InnerClassName> results = new ArrayList<InnerClassName>();
    public static class InnerClassName {
        int a;
        String b;
        boolean c;      
    }
}

তারপরে আপনি এটিকে পার্স করতে পারেন:

Gson gson = new Gson();
final ClassName className = gson.fromJson(data, ClassName.class);
int currentTotal = className.results.size();

এখন আপনি ক্লাসনেম অবজেক্টের প্রতিটি উপাদান অ্যাক্সেস করতে পারেন।


1

গসনের 'টাইপ' শ্রেণি বোঝার জন্য উদাহরণ 2 দেখুন।

উদাহরণ 1: এই ডিস্ট্রিলাইজ রিসোর্টারে আমরা কর্মচারী [] অ্যারে ব্যবহার করেছি এবং বিশদটি পাই

public static void deserializeResturant(){

       String empList ="[{\"name\":\"Ram\",\"empId\":1},{\"name\":\"Surya\",\"empId\":2},{\"name\":\"Prasants\",\"empId\":3}]";
       Gson gson = new Gson();
       Employee[] emp = gson.fromJson(empList, Employee[].class);
       int numberOfElementInJson = emp.length();
       System.out.println("Total JSON Elements" + numberOfElementInJson);
       for(Employee e: emp){
           System.out.println(e.getName());
           System.out.println(e.getEmpId());
       }
   }

উদাহরণ 2:

//Above deserilizeResturant used Employee[] array but what if we need to use List<Employee>
public static void deserializeResturantUsingList(){

    String empList ="[{\"name\":\"Ram\",\"empId\":1},{\"name\":\"Surya\",\"empId\":2},{\"name\":\"Prasants\",\"empId\":3}]";
    Gson gson = new Gson();

    // Additionally we need to se the Type then only it accepts List<Employee> which we sent here empTypeList
    Type empTypeList = new TypeToken<ArrayList<Employee>>(){}.getType();


    List<Employee> emp = gson.fromJson(empList, empTypeList);
    int numberOfElementInJson = emp.size();
    System.out.println("Total JSON Elements" + numberOfElementInJson);
    for(Employee e: emp){
        System.out.println(e.getName());
        System.out.println(e.getEmpId());
    }
}

0

আমি কেএ 1 থেকে উত্তরটি পছন্দ করেছি তবে আমি এটি প্রয়োগ করতে পারি নি। তাই আমি তার ধারণাটি ব্যবহার করে আমার নিজস্ব সংস্করণটি তৈরি করেছি।

public class JsonListHelper{
    public static final <T> List<T> getList(String json) throws Exception {
        Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
        Type typeOfList = new TypeToken<List<T>>(){}.getType();
        return gson.fromJson(json, typeOfList);
    }
}

ব্যবহার:

List<MyClass> MyList= JsonListHelper.getList(jsonArrayString);

আপনি সংকলন-সময় টি ব্যবহার করার চেষ্টা করছেন বলে অবশ্যই এটি কাজ করতে পারে না। এটি স্ট্রিংম্যাপের একটি তালিকাতে কার্যকরভাবে deserialize করবে, না?
জেএইচএইচ

0

আমার ক্ষেত্রে @ অচেনা_অযুক্তিগুলির উত্তর কার্যকর হয়নি, এর List.classপরিবর্তে আমাকে ব্যবহার করতে হয়েছিল java.lang.reflect.Type:

String jsonDuplicatedItems = request.getSession().getAttribute("jsonDuplicatedItems").toString();
List<Map.Entry<Product, Integer>> entries = gson.fromJson(jsonDuplicatedItems, List.class);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.