জসন এর সাথে কীভাবে JSON অ্যারে পার্স করবেন


86

আমি জেএসএন অ্যারে পার্স করতে এবং জিএসএন ব্যবহার করতে চাই। প্রথমত, আমি জেএসএন আউটপুট লগ করতে পারি, সার্ভার ক্লায়েন্টের সাথে স্পষ্টভাবে দায়বদ্ধ।

এখানে আমার JSON আউটপুট:

 [
      {
           id : '1',
           title: 'sample title',
           ....
      },
      {
           id : '2',
           title: 'sample title',
           ....
     },
      ...
 ]

পার্সিংয়ের জন্য আমি এই কাঠামোটি চেষ্টা করেছি। একটি শ্রেণি, যা একক arrayএবং ArrayListসমস্ত JSONArray এর জন্য নির্ভর করে ।

 public class PostEntity {

      private ArrayList<Post> postList = new ArrayList<Post>();

      public List<Post> getPostList() { 
           return postList; 
      }

      public void setPostList(List<Post> postList) { 
           this.postList = (ArrayList<Post>)postList; 
      } 
 }

পোস্ট ক্লাস:

 public class Post {

      private String id;
      private String title;

      /* getters & setters */
 }

আমি যখন জিএসএন ব্যবহার করার চেষ্টা করব তখন কোনও ত্রুটি, কোনও সতর্কতা এবং কোনও লগ নেই:

 GsonBuilder gsonb = new GsonBuilder();
 Gson gson = gsonb.create();

 PostEntity postEnt;
 JSONObject jsonObj = new JSONObject(jsonOutput);
 postEnt = gson.fromJson(jsonObj.toString(), PostEntity.class);

 Log.d("postLog", postEnt.getPostList().get(0).getId());

কী হয়েছে, আমি কীভাবে সমাধান করব?

উত্তর:


251

আপনি JSONArrayসরাসরি পার্স করতে পারেন , আরও একবারের Postসাথে আপনার ক্লাসটি মোড়ানোর দরকার নেই এবং নতুনেরও PostEntityদরকার নেই JSONObject().toString():

Gson gson = new Gson();
String jsonOutput = "Your JSON String";
Type listType = new TypeToken<List<Post>>(){}.getType();
List<Post> posts = gson.fromJson(jsonOutput, listType);

আশা করি এইটি কাজ করবে.


আমি পোস্টএন্টিটি ক্লাস মুছে ফেলেছি এবং এর পরিবর্তে আপনার স্নিপেট চেষ্টা করেছি। এখনও কোন পরিবর্তন। ধন্যবাদ
ওগলকান অরহান

অবশেষে সঠিক এবং দক্ষতার সাথে কাজ করেছেন। আপনাকে আবার অনেক ধন্যবাদ।
ওগলকান অরহান

হাই যেমন কীভাবে নেস্টেড জসন অ্যারে ডেটা পার্স করবেন তা .... [{"প্রথম নাম": "বিধান", "লাস্টনাম": "চ্যাটার্জী"}, [{"প্রকার": "ব্যক্তিগত", "সংখ্যা": "09832209761" }, {"প্রকার": "ফ্যাক্স", "সংখ্যা": "91-342-2567692"}]]
কে_07 কে

টাইপটোকেন ব্যবহার করে কি কোনও সুবিধা আছে? আমার পরীক্ষাগুলি থেকে, জিএসন টাইপটোকেন ব্যবহার না করে কোনও তালিকা <অবজেক্ট> ক্ষেত্রটি পরিচালনা করবে বলে মনে হচ্ছে।
গ্রেগ 7gkb

এটি আমার জন্য
সত্যিকারের সহায়ক

6

আমি আরও সাধারণ উপায়ে অবজেক্ট অ্যারে পার্স করার একটি উপায় খুঁজছিলাম; এখানে আমার অবদান:

CollectionDeserializer.java:

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;

public class CollectionDeserializer implements JsonDeserializer<Collection<?>> {

    @Override
    public Collection<?> deserialize(JsonElement json, Type typeOfT,
            JsonDeserializationContext context) throws JsonParseException {
        Type realType = ((ParameterizedType)typeOfT).getActualTypeArguments()[0];

        return parseAsArrayList(json, realType);
    }

    /**
     * @param serializedData
     * @param type
     * @return
     */
    @SuppressWarnings("unchecked")
    public <T> ArrayList<T> parseAsArrayList(JsonElement json, T type) {
        ArrayList<T> newArray = new ArrayList<T>();
        Gson gson = new Gson();

        JsonArray array= json.getAsJsonArray();
        Iterator<JsonElement> iterator = array.iterator();

        while(iterator.hasNext()){
            JsonElement json2 = (JsonElement)iterator.next();
            T object = (T) gson.fromJson(json2, (Class<?>)type);
            newArray.add(object);
        }

        return newArray;
    }

}

JSONParsingTest.java:

public class JSONParsingTest {

    List<World> worlds;

    @Test
    public void grantThatDeserializerWorksAndParseObjectArrays(){

        String worldAsString = "{\"worlds\": [" +
            "{\"name\":\"name1\",\"id\":1}," +
            "{\"name\":\"name2\",\"id\":2}," +
            "{\"name\":\"name3\",\"id\":3}" +
        "]}";

        GsonBuilder builder = new GsonBuilder();
        builder.registerTypeAdapter(Collection.class, new CollectionDeserializer());
        Gson gson = builder.create();
        Object decoded = gson.fromJson((String)worldAsString, JSONParsingTest.class);

        assertNotNull(decoded);
        assertTrue(JSONParsingTest.class.isInstance(decoded));

        JSONParsingTest decodedObject = (JSONParsingTest)decoded;
        assertEquals(3, decodedObject.worlds.size());
        assertEquals((Long)2L, decodedObject.worlds.get(1).getId());
    }
}

World.java:

public class World {
    private String name;
    private Long id;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

}

@Miere আমি এই তালিকা <পৃথিবী> এ JsonArray থেকে ধর্মান্তরিত বুঝতে পারছি না
ARK

মূলত, এটি GSON deserialization প্রক্রিয়া চলাকালীন পাওয়া প্রতিটি সংগ্রহের জন্য কালেকশনডিজারাইজার ব্যবহার করে। কালেকশন ডিজরিয়ালাইজার তার পালা, সংগ্রহের জেনেরিক প্যারামিটারের সাহায্যে অনুমান করে যে শ্রেণীর কোন শ্রেণীর সংগ্রহের অবজেক্ট স্টোরটি এটি ডিসেরায়ালাইজ করা উচিত represents আমি আশা করি এটি আপনার প্রশ্নের উত্তর দিয়েছে। আপনার যদি এখনও সন্দেহ থাকে তবে দয়া করে আমার সাথে [জিমেইল ডটকম এ miere00] এ যোগাযোগ করুন।
মিয়ার

হাই @ মিয়ার, এই সমাধানটি আসল প্রশ্নটি পরিচালনা করে না। আপনার JSONParsingTest ভিতরে একটি অ্যারে সহ একটি অবজেক্ট। আপনি কীভাবে আপনার সংগ্রহে ডিজিজারালাইজার ব্যবহার করবেন কীভাবে কেবল একটি অ্যারে পার্স করতে পারেন, কোনও অ্যারে কোনও বস্তুতে আবৃত নয়?
zkon

5

অবজেক্ট অ্যারে রূপান্তর করতে

Gson gson=new Gson();
ElementType [] refVar=gson.fromJson(jsonString,ElementType[].class);

পোস্টের ধরণ হিসাবে রূপান্তর করতে

Gson gson=new Gson();
Post [] refVar=gson.fromJson(jsonString,Post[].class);

এটি অবজেক্টের তালিকা হিসাবে পড়তে টাইপটোকেন ব্যবহার করা যেতে পারে

List<Post> posts=(List<Post>)gson.fromJson(jsonString, 
                     new TypeToken<List<Post>>(){}.getType());

অ্যারেলিস্ট <পোস্ট> হিসাবে কেমন?
gumuruh

3
Type listType = new TypeToken<List<Post>>() {}.getType();
List<Post> posts = new Gson().fromJson(jsonOutput.toString(), listType);

6
যদিও এটি প্রশ্নের উত্তর দিতে পারে, এটি কীভাবে বা কেন তা ব্যাখ্যা করার জন্য কোনও প্রসঙ্গ সরবরাহ করে না। আপনার উত্তরটি ব্যাখ্যা করার জন্য একটি বা দুটি বাক্য যুক্ত করার বিষয়টি বিবেচনা করুন।
ব্র্যান্ডস্ক্রিপ্ট

3

এই পোস্টের কয়েকটি উত্তর বৈধ, তবে টাইপটোকেন ব্যবহার করে, গসন লাইব্রেরি আপনার আবেদনের জন্য অবাস্তব ধরণের একটি বৃক্ষের বস্তু তৈরি করে।

এটি পেতে আমাকে অ্যারেটি পড়তে হয়েছিল এবং অ্যারের ভিতরে থাকা অবজেক্টগুলিকে একে একে রূপান্তর করতে হয়েছিল। অবশ্যই এই পদ্ধতিটি দ্রুত নয় এবং আপনার যদি অ্যারেটি খুব বড় হয় তবে আমি এটি ব্যবহার করার পরামর্শ দিচ্ছি না, তবে এটি আমার জন্য কার্যকর।

প্রকল্পে জসন লাইব্রেরি অন্তর্ভুক্ত করা প্রয়োজন। যদি আপনি অ্যান্ড্রয়েডে বিকাশ করে থাকেন তবে এটি অন্তর্ভুক্ত রয়েছে:

/**
 * Convert JSON string to a list of objects
 * @param sJson String sJson to be converted
 * @param tClass Class
 * @return List<T> list of objects generated or null if there was an error
 */
public static <T> List<T> convertFromJsonArray(String sJson, Class<T> tClass){

    try{
        Gson gson = new Gson();
        List<T> listObjects = new ArrayList<>();

        //read each object of array with Json library
        JSONArray jsonArray = new JSONArray(sJson);
        for(int i=0; i<jsonArray.length(); i++){

            //get the object
            JSONObject jsonObject = jsonArray.getJSONObject(i);

            //get string of object from Json library to convert it to real object with Gson library
            listObjects.add(gson.fromJson(jsonObject.toString(), tClass));
        }

        //return list with all generated objects
        return listObjects;

    }catch(Exception e){
        e.printStackTrace();
    }

    //error: return null
    return null;
}

3
[
      {
           id : '1',
           title: 'sample title',
           ....
      },
      {
           id : '2',
           title: 'sample title',
           ....
     },
      ...
 ]

এই আউটপুট জন্য সহজ কোড পরীক্ষা করুন

 Gson gson=new GsonBuilder().create();
                List<Post> list= Arrays.asList(gson.fromJson(yourResponse.toString,Post[].class));

1

নিম্নলিখিত কোডগুলি ব্যবহার করে আপনি সহজেই কোটলিনে এটি করতে পারেন:

val fileData = "your_json_string"
val gson = GsonBuilder().create()
val packagesArray = gson.fromJson(fileData , Array<YourClass>::class.java).toList()

মূলত, আপনি শুধুমাত্র একটি প্রদান করতে Arrayএর YourClassঅবজেক্ট।


আপনি প্রেটিপ্রিন্টিং কেন ব্যবহার করছেন?
এন্ট্রয়েড

@ আনড্রয়েড আমি এটি সরিয়ে দিতে ভুলে
গিয়েছি x

0

আপনি টাইপ অবজেক্ট ব্যবহার না করে তালিকার মান পেতে পারেন ।

EvalClassName[] evalClassName;
ArrayList<EvalClassName> list;
evalClassName= new Gson().fromJson(JSONArrayValue.toString(),EvalClassName[].class);
list = new ArrayList<>(Arrays.asList(evalClassName));

আমি এটি পরীক্ষা করেছি এবং এটি কাজ করছে।


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