如何使用改造在post请求中发送多个json对象?

时间:2015-07-26 04:06:56

标签: java android json gson retrofit

我有一个关键值对的json对象需要使用改造在post请求中发送

{
"Criteria":{
  "DisciplineId":0,
  "SeasonId":0,
  "Leagues":[

  ],
  "StartDate":"06 Sep 2013",
  "EndDate":"14 Dec 2013",
  "RoundId":0,
  "GroupId":0,
  "MatchesScores":3
},
"SearchInfo":{
  "PageNumber":1,
  "PageSize":20,
  "Sort":1,
  "TotalRecords":542
 }
}

我正在考虑创建一个匹配json对象的gson定义的POJO,然后使用POJO类中的setter来设置每个键值对的值。

所以我会有类似的东西

@FormUrlEncoded
@POST("/getMatches")
void getMatches(@Field("Criteria") Criteria criteria,@Field("SearchInfo") SearchInfo searchInfo, Callback<JSONKeys> keys);

我是否在正确的轨道上?

如何看到json对象中有两个嵌套的json对象以及带有这些对象之一的json数组?

1 个答案:

答案 0 :(得分:2)

您可以创建包含这两者的请求类。只要成员变量的名称与json匹配(或者您使用SerializedName),转换就会自动发生。

class MyRequest{
    @SerializedName("Criteria") Criteria criteria;
    @SerializedName("SearchInfo") SearchInfo searchInfo;
}

Criteria的位置:

class Criteria {
    @SerializedName("DisciplineId")  int disciplineId;
    @SerializedName("SeasonId")      int seasonId;
    @SerializedName("Leagues")       List<Integer> leagues; // Change Integer to datatype
    @SerializedName("StartDate")     String startDate;
    @SerializedName("EndDate")       String endDate;
    @SerializedName("RoundId")       int roundId;
    @SerializedName("GroupId")       int groupId;
    @SerializedName("MatchesScores") int matchesScores;
}

SearchInfo是:

class SearchInfo{
    @SerializedName("PageNumber")   int pageNumber;
    @SerializedName("PageSize")     int pageSize;
    @SerializedName("Sort")         int sort;
    @SerializedName("TotalRecords") int totalRecords;
}

使用try(请参阅here):

@POST("/getMatches")
public void getMatches(@Body MyRequest request, Callback<Boolean> success);

Retrofit在内部使用Gson,会自动将您的MyRequest对象转换为您在问题中描述的json格式。

注意:通常将json键命名为带下划线的小写,将java命名为camelcase。然后,不是在任何地方使用SerializedName,而是在创建gson对象时设置密钥命名约定(请参阅here):

Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create()