GSON throwing “Expected BEGIN_OBJECT but was BEGIN_ARRAY”?

后端 未结 10 643
暖寄归人
暖寄归人 2020-11-22 01:31

I\'m trying to parse a JSON string like this one

[
   {
      \"updated_at\":\"2012-03-02 21:06:01\",
      \"fetched_at\":\"2012-03-02 21:28:37.728840\",
           


        
10条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-11-22 01:44

    In my case JSON string:

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

    and I print "category" and "url_title" in 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;
    
    /**
     * Created by Shweta.Chauhan on 13/07/16.
     */
    
    public interface RequestInterface {
    
       @GET("facts/json/progress/all")
       Call> 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;
    
    /**
     * Created by Shweta.Chauhan on 13/07/16.
     */
    
    public class DataAdapter extends RecyclerView.Adapter{
    
    private Context context;
    private List dataList;
    
    public DataAdapter(Context context, List 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);
        }
    }
    }
    

    and finally 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 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> call= requestInterface.getJSON();
        call.enqueue(new Callback>() {
            @Override
            public void onResponse(Call> call, Response> response) {
                dataArrayList = response.body();
                dataAdapter=new DataAdapter(getApplicationContext(),dataArrayList);
                recyclerView.setAdapter(dataAdapter);
            }
    
            @Override
            public void onFailure(Call> call, Throwable t) {
                Log.e("Error",t.getMessage());
            }
        });
    }
    }
    

提交回复
热议问题