2017-10-05 108 views
0

我发现的帖子都没有帮助我理解我应该做什么。在此停留了很长一段时间,所以在这里问。我希望IN和OUT名称列为“in”和“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/

在示例类有唯一的消息和planId。我最初在界面中调用示例类。但认为错误可能是因为这样,所以将其更改为列表,但没有。从网站

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

提供您的POJO的代码 –

回答

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(); 
     } 
    }); 
+0

真棒!我看到了“response.getPlanData()。getVotes .....”这行,并且知道这是它。但只是添加,“response.get ...”不起作用..“response.body()。get ...”的作品。 – L3G3NDj

+0

然后投票回答。 –

+0

String.valueOf(vote)的值在我的手机上打印为“com”。[email protected]“等等我将如何解决这个问题? – L3G3NDj

0

你正试图从响应得到JSON数组但rsponse包含的JSONObject

+0

我到底是什么问题,你刚刚输入的花花公子。我如何得到该死的名字?开始翻新昨天所以没有完全理解的工作和概念 – L3G3NDj

+0

它易于理解简单的JSON与一个主要对象,然后只是嵌套键和电影的另一个例子。但是这个json似乎更复杂一点。所以即时变得困惑 – L3G3NDj

1

权的方式来解析服务器响应

更改接口

@GET("/") 
Call<Example> getInUsers(); 

更改呼叫

Call<Example> call1 = api.getInUsers(); 
    call1.enqueue(new Callback<Example>() { 
     @Override 
     public void onResponse(Call<Example> call1, Response<Example> response) { 
      List<In> inUsers = response.body().getPlanData().getVotesData().getVotes().getIn(); 
      ...your other code here... 
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(); 
    } 

    // ... 
}); 
+0

真的很棒你。 – L3G3NDj

相关问题