改造 - > java.lang.IllegalStateException:预期为BEGIN_ARRAY,但在第1行第2行路径为$ BEGIN_OBJECT

时间:2017-10-05 09:04:15

标签: android json retrofit2

我发现的帖子都没有帮助我理解我应该做的事情。坚持这一点已经有一段时间了,所以问这里。我希望IN和OUT名称列表为"在"和" out"是json数组。该错误在OnFailure响应中显示为异常。 getUsers()是主要活动。

private void getUsers() {


        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    APIInterface api = retrofit.create(APIInterface.class);

    Call<List<In>> call1 = api.getInUsers();
    call1.enqueue(new Callback<List<In>>() {
        @Override
        public void onResponse(Call<List<In>> call1, Response<List<In>> response) {
            List<In> inUsers = response.body();
            Log.v("InUsers",String.valueOf(inUsers));
            data.add(new Vote(Vote.HEADER_TYPE,"IN"));
            mAdapter.notifyDataSetChanged();
            for(In vote : inUsers) {
                data.add(new Vote(Vote.ITEM_TYPE,String.valueOf(vote)));
            }


        }

        @Override
        public void onFailure(Call<List<In>> call1, Throwable t) {
            Toast.makeText(getActivity().getApplicationContext(), t.getMessage() + "IN LIST", Toast.LENGTH_LONG).show();
        }
    });
}

json是:

 {
 "message": "Hello World.",
 "planData": {
     "planId":"44444410",
     "votesData": {
         "votes": {
             "in":[ 
                 {
                     "firstName" : "Raj",
                     "lastName" : "Taj"
                 },
                 {
                     "firstName" : "Badger",
                     "lastName" : "Tagger"
                 },
                  {
                     "firstName" : "Candle",
                     "lastName" : "Bangle"
                 }
                 ] , 
                 "out" : [
                     {
                     "firstName" : "Bonnie",
                     "lastName" : "Clooney"
                 },
                 {
                     "firstName" : "Clyde",
                     "lastName" : "Hyde"
                 }
                 ]
         }
     }
 }
}

界面:

public interface APIInterface {
@GET("/")
Call<List<In>> getInUsers();

    @GET("/")
    Call<List<Out>> getOutUsers();
}

我从http://www.jsonschema2pojo.org/

获得了模型

在示例类中只有message和planId。我最初在接口中调用了示例类。但是认为错误可能是因为它因此将其更改为List但没有。

网站上的POJO代码:

>  
> -----------------------------------com.example.Example.java-----------------------------------
> 
> package com.example;
> 
> import com.google.gson.annotations.Expose; import
> com.google.gson.annotations.SerializedName;
> 
> public class Example {
> 
> @SerializedName("message") @Expose private String message;
> @SerializedName("planData") @Expose private PlanData planData;
> 
> public String getMessage() { return message; }
> 
> public void setMessage(String message) { this.message = message; }
> 
> public PlanData getPlanData() { return planData; }
> 
> public void setPlanData(PlanData planData) { this.planData = planData;
> }
> 
> }
> -----------------------------------com.example.In.java-----------------------------------
> 
> package com.example;
> 
> import com.google.gson.annotations.Expose; import
> com.google.gson.annotations.SerializedName;
> 
> public class In {
> 
> @SerializedName("firstName") @Expose private String firstName;
> @SerializedName("lastName") @Expose private String lastName;
> 
> public String getFirstName() { return firstName; }
> 
> public void setFirstName(String firstName) { this.firstName =
> firstName; }
> 
> public String getLastName() { return lastName; }
> 
> public void setLastName(String lastName) { this.lastName = lastName; }
> 
> }
> -----------------------------------com.example.Out.java-----------------------------------
> 
> package com.example;
> 
> import com.google.gson.annotations.Expose; import
> com.google.gson.annotations.SerializedName;
> 
> public class Out {
> 
> @SerializedName("firstName") @Expose private String firstName;
> @SerializedName("lastName") @Expose private String lastName;
> 
> public String getFirstName() { return firstName; }
> 
> public void setFirstName(String firstName) { this.firstName =
> firstName; }
> 
> public String getLastName() { return lastName; }
> 
> public void setLastName(String lastName) { this.lastName = lastName; }
> 
> }
> -----------------------------------com.example.PlanData.java-----------------------------------
> 
> package com.example;
> 
> import com.google.gson.annotations.Expose; import
> com.google.gson.annotations.SerializedName;
> 
> public class PlanData {
> 
> @SerializedName("planId") @Expose private String planId;
> @SerializedName("votesData") @Expose private VotesData votesData;
> 
> public String getPlanId() { return planId; }
> 
> public void setPlanId(String planId) { this.planId = planId; }
> 
> public VotesData getVotesData() { return votesData; }
> 
> public void setVotesData(VotesData votesData) { this.votesData =
> votesData; }
> 
> }
> -----------------------------------com.example.Votes.java-----------------------------------
> 
> package com.example;
> 
> import java.util.List; import com.google.gson.annotations.Expose;
> import com.google.gson.annotations.SerializedName;
> 
> public class Votes {
> 
> @SerializedName("in") @Expose private List<In> in = null;
> @SerializedName("out") @Expose private List<Out> out = null;
> 
> public List<In> getIn() { return in; }
> 
> public void setIn(List<In> in) { this.in = in; }
> 
> public List<Out> getOut() { return out; }
> 
> public void setOut(List<Out> out) { this.out = out; }
> 
> }
> -----------------------------------com.example.VotesData.java-----------------------------------
> 
> package com.example;
> 
> import com.google.gson.annotations.Expose; import
> com.google.gson.annotations.SerializedName;
> 
> public class VotesData {
> 
> @SerializedName("votes") @Expose private Votes votes;
> 
> public Votes getVotes() { return votes; }
> 
> public void setVotes(Votes votes) { this.votes = votes; }
> 
> }

4 个答案:

答案 0 :(得分:1)

解析服务器响应的正确方法

  

更改界面

-c
  

更改电话

-b

答案 1 :(得分:0)

您正在尝试从响应中获取Json数组,但rsponse包含JsonObject

答案 2 :(得分:0)

你必须这样做。

public interface APIInterface {
@GET("/")
Call<Example> getInUsers();

    @GET("/")
    Call<List<Out>> getOutUsers();
}

您的活动如下。

Call<Example> call1 = api.getInUsers();
    call1.enqueue(new Callback<Example>() {
        @Override
        public void onResponse(Call<Example> call1, Response<Example> response) {
            List<In> inUsers = response. getPlanData(). getVotesData().getVotes().getIn();
            Log.v("InUsers",String.valueOf(inUsers));
            data.add(new Vote(Vote.HEADER_TYPE,"IN"));
            mAdapter.notifyDataSetChanged();
            for(In vote : inUsers) {
                data.add(new Vote(Vote.ITEM_TYPE,String.valueOf(vote)));
            }


        }

        @Override
        public void onFailure(Call<Example> call1, Throwable t) {
            Toast.makeText(getActivity().getApplicationContext(), t.getMessage() + "IN LIST", Toast.LENGTH_LONG).show();
        }
    });

答案 3 :(得分:0)

API不会返回List<In>List<Out>。相反,它返回一个Example对象。而不是

public interface APIInterface {
@GET("/")
Call<List<In>> getInUsers();

    @GET("/")
    Call<List<Out>> getOutUsers();
}

你应该使用

public interface APIInterface {
    @GET("/")
    Call<Example> getUsers();
}

所以你的电话应该是这样的:

Call<Example> call = api.getInUsers();
call.enqueue(new Callback<Example>() {
    @Override
    public void onResponse(Call<Example> call1, Response<Example> response) {
        // ... whatever you want to do with that data.
        // E.g. you can access inUsers via response.body().getPlanData().getVotesData().getVotes().getIn();
    }

    // ...
});