GSON lance "BEGIN_OBJECT attendu mais BEGIN_ARRAY"?

J'essaie d'analyser une chaîne JSON comme celle-ci

[ { "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" } ] 

Dans une liste d'objets.

  • Android ImageView ajustant la hauteur du parent et l'épaisseur du raccord
  • L'auditeur OnClick de la barre d'action pour le bouton Accueil
  • Android R.java ne générera pas dans Eclipse
  • Android: problème avec le jurageage de débogage dans la visualisation web
  • Enregistrez l'identifiant de périphérique directement avec Amazon SNS
  • RTSP youtube link
  •  List<channelSearchEnum> lcs = (List<channelSearchEnum>) new Gson().fromJson( jstring , channelSearchEnum.class); 

    Voici une classe d'objet que j'utilise.

     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; } } 

    Mais il me jette avec

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

    Toutes les idées comment je devrais le réparer?

  • Android cache clavier doux IME
  • Android: Centre une image
  • Comment puis-je définir l'emplacement par défaut et le niveau de zoom pour google map api v2?
  • Différence FragmentPagerAdapter et PagerAdapter
  • Modification de l'emplacement du curseur dans un EditText étendu
  • Intercepter et remplacer les requêtes HTTP de WebView
  • 5 Solutions collect form web for “GSON lance "BEGIN_OBJECT attendu mais BEGIN_ARRAY"?”

    Le problème est que vous dites à Gson vous avez un objet de votre type. Vous ne le faites pas. Vous disposez d'un ensemble d'objets de votre type. Vous ne pouvez pas simplement essayer de lancer le résultat comme ça et s'attendre à ce qu'il fonctionne magiquement;)

    Le guide de l'utilisateur pour Gson Explique comment traiter ceci:

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

    Cela fonctionnera:

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

    Mais c'est mieux:

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

    Le problème est que vous demandez un objet de type channelSearchEnum mais ce que vous avez réellement est un objet du type List<channelSearchEnum> .

    Vous pouvez y parvenir avec:

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

    Dans mon cas, la chaîne JSON:

     [{"category":"College Affordability", "uid":"150151", "body":"Ended more than $60 billion in wasteful subsidies for big banks and used the savings to put the cost of college within reach for more families.", "url":"http:\/\/www.whitehouse.gov\/economy\/middle-class\/helping middle-class-families-pay-for-college", "url_title":"ending subsidies for student loan lenders", "type":"Progress", "path":"node\/150385"}] 

    Et j'imprime "category" et "url_title" dans recycleview

    Datum.class

     import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Datum { @SerializedName("category") @Expose private String category; @SerializedName("uid") @Expose private String uid; @SerializedName("url_title") @Expose private String urlTitle; /** * @return The category */ public String getCategory() { return category; } /** * @param category The category */ public void setCategory(String category) { this.category = category; } /** * @return The uid */ public String getUid() { return uid; } /** * @param uid The uid */ public void setUid(String uid) { this.uid = uid; } /** * @return The urlTitle */ public String getUrlTitle() { return urlTitle; } /** * @param urlTitle The url_title */ public void setUrlTitle(String urlTitle) { this.urlTitle = urlTitle; } } 

    RequestInterface

     import java.util.List; import retrofit2.Call; import retrofit2.http.GET; 

    / ** * Créé par Shweta.Chauhan le 13/07/16. * /

     public interface RequestInterface { @GET("facts/json/progress/all") Call<List<Datum>> getJSON(); 

    }

    DataAdapter

     import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.ArrayList; import java.util.List; 

    / ** * Créé par Shweta.Chauhan le 13/07/16. * /

     public class DataAdapter extends RecyclerView.Adapter<DataAdapter.MyViewHolder>{ private Context context; private List<Datum> dataList; public DataAdapter(Context context, List<Datum> dataList) { this.context = context; this.dataList = dataList; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.data,parent,false); return new MyViewHolder(view); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.categoryTV.setText(dataList.get(position).getCategory()); holder.urltitleTV.setText(dataList.get(position).getUrlTitle()); } @Override public int getItemCount() { return dataList.size(); } public class MyViewHolder extends RecyclerView.ViewHolder{ public TextView categoryTV, urltitleTV; public MyViewHolder(View itemView) { super(itemView); categoryTV = (TextView) itemView.findViewById(R.id.txt_category); urltitleTV = (TextView) itemView.findViewById(R.id.txt_urltitle); } } } 

    Et enfin MainActivity.java

     import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private DataAdapter dataAdapter; private List<Datum> dataArrayList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViews(); } private void initViews(){ recyclerView=(RecyclerView) findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); loadJSON(); } private void loadJSON(){ dataArrayList = new ArrayList<>(); Retrofit retrofit=new Retrofit.Builder().baseUrl("https://www.whitehouse.gov/").addConverterFactory(GsonConverterFactory.create()).build(); RequestInterface requestInterface=retrofit.create(RequestInterface.class); Call<List<Datum>> call= requestInterface.getJSON(); call.enqueue(new Callback<List<Datum>>() { @Override public void onResponse(Call<List<Datum>> call, Response<List<Datum>> response) { dataArrayList = response.body(); dataAdapter=new DataAdapter(getApplicationContext(),dataArrayList); recyclerView.setAdapter(dataAdapter); } @Override public void onFailure(Call<List<Datum>> call, Throwable t) { Log.e("Error",t.getMessage()); } }); } } 

    Une alternative pourrait être

    Pour que votre réponse ressemble

    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" } ] } 

    au lieu de

    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" } ] 

    CODE

      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); 

    Après cela, ce sera tout autre GSON Parsing

    Selon GSON Guide de l'utilisateur , vous ne pouvez pas.

    Limites de collections

    Peut sérialiser la collection d'objets arbitraires mais ne peut pas se désérialiser. Parce qu'il n'y a aucun moyen pour l'utilisateur d'indiquer le type de l'objet résultant

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.