java - GSON নিক্ষেপ "প্রত্যাশিত BEGIN_OBJECT কিন্তু BEGIN_ARRAY" ছিল?




android (5)

আমি এই মত একটি JSON স্ট্রিং বিশ্লেষণ করার চেষ্টা করছি

[
   {
      "updated_at":"2012-03-02 21:06:01",
      "fetched_at":"2012-03-02 21:28:37.728840",
      "description":null,
      "language":null,
      "title":"JOHN",
      "url":"http://rus.JOHN.JOHN/rss.php",
      "icon_url":null,
      "logo_url":null,
      "id":"4f4791da203d0c2d76000035",
      "modified":"2012-03-02 23:28:58.840076"
   },
   {
      "updated_at":"2012-03-02 14:07:44",
      "fetched_at":"2012-03-02 21:28:37.033108",
      "description":null,
      "language":null,
      "title":"PETER",
      "url":"http://PETER.PETER.lv/rss.php",
      "icon_url":null,
      "logo_url":null,
      "id":"4f476f61203d0c2d89000253",
      "modified":"2012-03-02 23:28:57.928001"
   }
]

বস্তুর একটি তালিকা মধ্যে।

List<ChannelSearchEnum> lcs = (List<ChannelSearchEnum>) new Gson().fromJson( jstring , ChannelSearchEnum.class);

এখানে একটি বস্তু ক্লাস ব্যবহার করছি।

import com.google.gson.annotations.SerializedName;

public class ChannelSearchEnum {



@SerializedName("updated_at")
private String updated_at;

@SerializedName("fetched_at")
private String fetched_at;

@SerializedName("description")
private String description;

@SerializedName("language")
private String language;

@SerializedName("title")
private String title;

@SerializedName("url")
private String url;

@SerializedName("icon_url")
private String icon_url;

@SerializedName("logo_url")
private String logo_url;

@SerializedName("id")
private String id;

@SerializedName("modified")
private String modified;

public final String get_Updated_at() {
    return this.updated_at;
}

public final String get_Fetched_at() {
    return this.fetched_at;
}

public final String get_Description() {
    return this.description;
}

public final String get_Language() {
    return this.language;
}

public final String get_Title() {
    return this.title;
}

public final String get_Url() {
    return this.url;
}

public final String get_Icon_url() {
    return this.icon_url;
}

public final String get_Logo_url() {
    return this.logo_url;
}

public final String get_Id() {
    return this.id;
}

public final String get_Modified() {
    return this.modified;
}

        }

কিন্তু এটা আমার সাথে ছুড়ে ফেলে

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2

কোন ধারনা আমি কিভাবে এটা ঠিক করা উচিত?


Answers

সমস্যাটি হল যে আপনি ChannelSearchEnum টাইপের একটি বস্তুর জন্য জিজ্ঞাসা করছেন তবে আপনার কাছে আসলে যা রয়েছে তা হল List<ChannelSearchEnum>

আপনি এটি দিয়ে অর্জন করতে পারেন:

Type collectionType = new TypeToken<List<ChannelSearchEnum>>(){}.getType();
List<ChannelSearchEnum> lcs = (List<ChannelSearchEnum>) new Gson()
               .fromJson( jstring , collectionType);

সমস্যা আপনি Gson আপনার টাইপ একটি বস্তুর আছে বলছে হয়। আপনি না। আপনি আপনার টাইপ বস্তুর একটি অ্যারে আছে। আপনি শুধু এরকম ফলাফলটি চেষ্টা করে নিবেন না এবং এটি জাদুকরীভাবে কাজ করার আশা করছেন;)

Gson জন্য ব্যবহারকারীর নির্দেশিকা ব্যাখ্যা করে কিভাবে এটি মোকাবেলা করতে হয়:

https://github.com/google/gson/blob/master/UserGuide.md

এটা কাজ করবে

ChannelSearchEnum[] enums = gson.fromJson(yourJson, ChannelSearchEnum[].class);

কিন্তু এই ভাল:

Type collectionType = new TypeToken<Collection<ChannelSearchEnum>>(){}.getType();
Collection<ChannelSearchEnum> enums = gson.fromJson(yourJson, collectionType);

জিএসএন ইউজার গাইড অনুযায়ী, আপনি পারবেন না।

সংগ্রহ সীমাবদ্ধতা

ইচ্ছাকৃত বস্তুর সংগ্রহ serialize করতে পারেন কিন্তু এটি থেকে deserialize করতে পারবেন না। যেহেতু ব্যবহারকারীর ফলে বস্তুর ধরন নির্দেশ করার কোন উপায় নেই


বিকল্প হতে পারে

আপনার প্রতিক্রিয়া মত চেহারা করতে

myCustom_JSONResponse

{"master":[
   {
      "updated_at":"2012-03-02 21:06:01",
      "fetched_at":"2012-03-02 21:28:37.728840",
      "description":null,
      "language":null,
      "title":"JOHN",
      "url":"http://rus.JOHN.JOHN/rss.php",
      "icon_url":null,
      "logo_url":null,
      "id":"4f4791da203d0c2d76000035",
      "modified":"2012-03-02 23:28:58.840076"
   },
   {
      "updated_at":"2012-03-02 14:07:44",
      "fetched_at":"2012-03-02 21:28:37.033108",
      "description":null,
      "language":null,
      "title":"PETER",
      "url":"http://PETER.PETER.lv/rss.php",
      "icon_url":null,
      "logo_url":null,
      "id":"4f476f61203d0c2d89000253",
      "modified":"2012-03-02 23:28:57.928001"
   }
]
}

পরিবর্তে

server_JSONResponse

[
   {
      "updated_at":"2012-03-02 21:06:01",
      "fetched_at":"2012-03-02 21:28:37.728840",
      "description":null,
      "language":null,
      "title":"JOHN",
      "url":"http://rus.JOHN.JOHN/rss.php",
      "icon_url":null,
      "logo_url":null,
      "id":"4f4791da203d0c2d76000035",
      "modified":"2012-03-02 23:28:58.840076"
   },
   {
      "updated_at":"2012-03-02 14:07:44",
      "fetched_at":"2012-03-02 21:28:37.033108",
      "description":null,
      "language":null,
      "title":"PETER",
      "url":"http://PETER.PETER.lv/rss.php",
      "icon_url":null,
      "logo_url":null,
      "id":"4f476f61203d0c2d89000253",
      "modified":"2012-03-02 23:28:57.928001"
   }
]

কোড

  String server_JSONResponse =.... // the string in which you are getting your JSON Response after hitting URL
String myCustom_JSONResponse="";// in which we will keep our response after adding object element to it
     MyClass apiResponse = new MyClass();

     myCustom_JSONResponse="{\"master\":"+server_JSONResponse+"}";



    apiResponse = gson.fromJson(myCustom_JSONResponse, MyClass .class);

এর পরে এটি অন্য কোনও GSON Parsing


আদর্শভাবে, পরিষেবা স্তর (ম্যানেজার) আপনার ব্যবসার যুক্তি উপস্থাপন করে এবং তাই এটি @Transactional ট্রানসেকশনাল এর সাথে @Transactional করা উচিত। পরিষেবা স্তরটি ডিবি ক্রিয়াকলাপগুলি পরিচালনা করতে বিভিন্ন DAO কে কল করতে পারে। চলুন এমন একটি পরিস্থিতি ধরুন যেখানে আপনার একটি পরিষেবা পদ্ধতিতে DAO অপারেশনগুলির সংখ্যা আছে। আপনার প্রথম DAO অপারেশন ব্যর্থ হলে, অন্যরা এখনও পাস হতে পারে এবং আপনি অসঙ্গতিপূর্ণ ডিবি রাষ্ট্র শেষ করবেন। পরিষেবা স্তর Annotating আপনি এই পরিস্থিতিতে থেকে সংরক্ষণ করতে পারেন।







java android gson