2017-12-27 287 views
0

我得到了错误java.lang.illegalstateException:预期BEGIN_OBJECT但行1列42是BEGIN_ARRAY当与改造呼叫API,这里是我的代码:java.lang.illegalstateException:预期BEGIN_OBJECT但BEGIN_ARRAY改造

下面是我的界面:

@FormUrlEncoded 
@POST("myCollection") 
Call<APIResponse<List<MyCollection>>> getMyCollection(
     @Field("caller_id") String caller_id 
); 

这里是召唤:

public class UploadVideoToneActivity extends BaseActivity{ 
List<MyCollection> collection = new ArrayList<>(); 

private void loadCollection() { 

    ContactItem callerID = SessionManager.getProfile(this); 
    Call<APIResponse<MyCollection>> call = ServicesFactory.getService().getMyCollection(callerID.caller_id); 
    call.enqueue(new Callback<APIResponse<MyCollection>>() { 
     @Override 
     public void onResponse(Call<APIResponse<MyCollection>> call, Response<APIResponse<MyCollection>> response) { 
      if (response.isSuccessful() && response.body().isSuccessful()) { 
       List<MyCollection> data = (List<MyCollection>) response.body().data; 
       if (data != null) { 
        collection.clear(); 
        collection.addAll(data); 
        rvCollection.getAdapter().notifyDataSetChanged(); 
       } 
      } 
      else { 
       Toast.makeText(UploadVideoToneActivity.this, response.errorBody().toString(), Toast.LENGTH_LONG).show(); 
      } 
     } 

     @Override 
     public void onFailure(Call<APIResponse<MyCollection>> call, Throwable t) { 
      Toast.makeText(UploadVideoToneActivity.this, t.getLocalizedMessage(), Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 

这里是JSON格式响应从API, 下面是API的格式JSON响应,

{ 
"code": 200, 
"error_message": null, 
"data": [ 
    [ 
     { 
      "caller_id": "44", 
      "content_id": "003", 
      "alias": "Eli Sugigi", 
      "judul": "Angkat sekarang juga", 
      "source_content": "http://bla.bla.mp4", 
      "thumb_pic": "http://bla.bla.mp4", 
      "sub_start": "2017-12-27 14:17:10", 
      "sub_end": "2018-01-03 00:00:00" 
     } 
    ], 
    [ 
     { 
      "caller_id": "44", 
      "content_id": "002", 
      "alias": "Eli Sugigi", 
      "judul": "Mas Ganteng Angkat Dong", 
      "source_content":"source_content": "http://bla.bla.mp4", 
      "thumb_pic": "http://bla.bla.mp4", 
      "thumb_pic":"source_content": "http://bla.bla.mp4", 
      "thumb_pic": "http://bla.bla.mp4", 
      "sub_start": "2017-12-27 15:52:40", 
      "sub_end": "2018-01-03 00:00:00" 
     } 
    ] 
    ] 
    } 

这里是MyCollection的类:

public class MyCollection implements Parcelable { 
@SerializedName("content_id") 
@Expose 
public String content_id; 
@SerializedName("alias") 
@Expose 
public String alias ; 
@SerializedName("judul") 
@Expose 
public String judul; 
@SerializedName("source_content") 
@Expose 
public String source_content; 
@SerializedName("thumb_pic") 
@Expose 
public String thumb_pic; 
@SerializedName("sub_start") 
@Expose 
public String sub_start ; 
@SerializedName("sub_end") 
@Expose 
public String sub_end ; 



protected MyCollection(Parcel in) { 
    content_id = in.readString(); 
    alias = in.readString(); 
    judul = in.readString(); 
    source_content = in.readString(); 
    thumb_pic = in.readString(); 
    sub_start = in.readString(); 
    sub_end = in.readString(); 
} 

public static final Creator<MyCollection> CREATOR = new Creator<MyCollection>() { 
    @Override 
    public MyCollection createFromParcel(Parcel in) { 
     return new MyCollection(in); 
    } 

    @Override 
    public MyCollection[] newArray(int size) { 
     return new MyCollection[size]; 
    } 
}; 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel parcel, int i) { 
    parcel.writeString(content_id); 
    parcel.writeString(alias); 
    parcel.writeString(judul); 
    parcel.writeString(source_content); 
    parcel.writeString(thumb_pic); 
    parcel.writeString(sub_start); 
    parcel.writeString(sub_end); 
} 
} 
+0

显示您的MyCollection的类 – ABDevelopers

+0

显示您ApiResponse 类 – ABDevelopers

回答

1

您提供的所有JSON首先是不正确的:

这是正确的JSON:

{ 
    "code": 200, 
    "error_message": null, 
    "data": [{ 
      "caller_id": "44", 
      "content_id": "003", 
      "alias": "Eli Sugigi", 
      "judul": "Angkat sekarang juga", 
      "source_content": "http://bla.bla.mp4", 
      "thumb_pic": "http://bla.bla.mp4", 
      "sub_start": "2017-12-27 14:17:10", 
      "sub_end": "2018-01-03 00:00:00" 
     }, 
     { 
      "caller_id": "44", 
      "content_id": "002", 
      "alias": "Eli Sugigi", 
      "judul": "Mas Ganteng Angkat Dong", 
      "source_content": "http://bla.bla.mp4", 
      "thumb_pic": "http://bla.bla.mp4", 
      "sub_start": "2017-12-27 15:52:40", 
      "sub_end": "2018-01-03 00:00:00" 
     } 
    ] 
} 

后来你的回应类用这个作为响应等级:

public class MyResponseClass 
{ 
    private String error_message; 

    private ArrayList<Data> data; 

    private String code; 

    public String getError_message() 
    { 
     return error_message; 
    } 

    public void setError_message (String error_message) 
    { 
     this.error_message = error_message; 
    } 

    public ArrayList<Data> getData() 
    { 
     return data; 
    } 

    public void setData (ArrayList<Data> data) 
    { 
     this.data = data; 
    } 

    public String getCode() 
    { 
     return code; 
    } 

    public void setCode (String code) 
    { 
     this.code = code; 
    } 

    @Override 
    public String toString() 
    { 
     return "ClassPojo [error_message = "+error_message+", data = "+data+", code = "+code+"]"; 
    } 
} 

后来使用MyResponseData作为您的改进数据解析器:

ContactItem callerID = SessionManager.getProfile(this); 
    Call<MyResponseData> call = ServicesFactory.getService().getMyCollection(callerID.caller_id); 

,并在您onResponse:

@Override 
     public void onResponse(Call<MyResponseData> call, Response<MyResponseData> response) { 
      if (response.isSuccessful() && response.body().isSuccessful()) { 
       //here collection will be arraylist of MyCollection class 
        collection.clear(); 
        collection.addAll(response.body().getData()); 
        rvCollection.getAdapter().notifyDataSetChanged(); 

      } 
      else { 
       Toast.makeText(UploadVideoToneActivity.this, response.errorBody().toString(), Toast.LENGTH_LONG).show(); 
      } 
     } 

测试它,如果需要的话

+0

谢谢ABDevelopers, so“data”:[ [ [ ] [ double array is can not be applied? – asqa

+0

不,它是invalida json首先 – ABDevelopers

+0

在数组中你可以有多个对象[{},{}],如果你想嵌套的数组不是[{[{}]},{[{}]}] – ABDevelopers

1

问题是你所得到的“JSONArray的回应和你想收到在JSONObject

您应该使用'List'作为返回类型getMyCollection(callerID.caller_id)方法。然后执行该方法。

onResponse方法,你必须得到像下面

List<MyCollection> data = (List<MyCollection>) response.body() 

更新

您可以点击这里查看列表(http://pojo.sodhanalibrary.com/

把你JSON响应,然后按提交。您将获得Pojo类结构。

+0

感谢Asish,我媒体链接更改我的代码在onResponse,但仍然得到了同样的错误.. :( 你有另一种解决方案? – asqa

+0

的“JSON”响应你 –

+0

请检查Json上面,我已经更新了新的.. :) – asqa

1

作出轻微修改尝试从APIResponse<MyCollection>更改为APIResponse<List<MyCollection>>

因此,代码变为:

public class UploadVideoToneActivity extends BaseActivity{ 
List<MyCollection> collection = new ArrayList<>(); 

private void loadCollection() { 

    ContactItem callerID = SessionManager.getProfile(this); 
    Call<APIResponse<List<MyCollection>>> call = ServicesFactory.getService().getMyCollection(callerID.caller_id); 
    call.enqueue(new Callback<APIResponse<List<MyCollection>>>() { 
     @Override 
     public void onResponse(Call<APIResponse<List<MyCollection>>> call, Response<APIResponse<List<MyCollection>>> response) { 
      if (response.isSuccessful() && response.body().isSuccessful()) { 
       List<MyCollection> data = (List<MyCollection>) response.body().data; 
       if (data != null) { 
        collection.clear(); 
        collection.addAll(data); 
        rvCollection.getAdapter().notifyDataSetChanged(); 
       } 
      } 
      else { 
       Toast.makeText(UploadVideoToneActivity.this, response.errorBody().toString(), Toast.LENGTH_LONG).show(); 
      } 
     } 

     @Override 
     public void onFailure(Call<APIResponse<List<MyCollection>>> call, Throwable t) { 
      Toast.makeText(UploadVideoToneActivity.this, t.getLocalizedMessage(), Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 

而且更新您的Json(部分)至:

"data": [{ 
      "caller_id": "44", 
      "content_id": "003", 
      "alias": "Eli Sugigi", 
      "judul": "Angkat sekarang juga", 
      "source_content": "http://bla.bla.mp4", 
      "thumb_pic": "http://bla.bla.mp4", 
      "sub_start": "2017-12-27 14:17:10", 
      "sub_end": "2018-01-03 00:00:00" 
     }, 
     { 
      "caller_id": "44", 
      "content_id": "002", 
      "alias": "Eli Sugigi", 
      "judul": "Mas Ganteng Angkat Dong", 
      "source_content": "http://bla.bla.mp4", 
      "thumb_pic": "http://bla.bla.mp4", 
      "sub_start": "2017-12-27 15:52:40", 
      "sub_end": "2018-01-03 00:00:00" 
     } 
    ] 

希望它有帮助!

+0

如何,如果我的JSON这样 “数据”:[{ [ {现在我不能进去这里的数据(在第2个数组)} ] } – asqa

+0

如果你把你的JSON,如:** [{ [{**那么第二个数组被认为完全不同于第一个数组,您可能必须为每个'JsonArray'指定不同的键来获取适当的数据;如**“data”:{“key1”:[{}],“key2”:[{}]} ** –

相关问题