【问题标题】:How to send multiple json objects in a post request using retrofit?如何使用改造在发布请求中发送多个 json 对象?
【发布时间】:2015-10-16 11:36:30
【问题描述】:

我有这个键值对的 json 对象,需要使用改造在发布请求中发送

{
"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 类中的设置器为每个键值对设置值。

所以我会有这样的东西

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

我在正确的轨道上吗?

看到 json 对象中有两个嵌套的 json 对象以及包含这些对象之一的 json 数组,我该如何实现这一点?

【问题讨论】:

    标签: java android json gson retrofit


    【解决方案1】:

    您可以创建一个包含这两者的请求类。只要成员变量的名称与 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 命名为驼峰式。然后在创建 gson 对象时设置密钥命名约定,而不是到处使用 SerializedName(参见 here):

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

    【讨论】:

    • 大声笑..这是我拥有的确切类定义。我现在担心的是,在我为类(两个 gson 对象)设置值之后,我可以说getMatches(MyRequest.getCriteria, MyRequest.getSearchInfo)吗?
    • @CastellJames 为什么不直接使用getMatches(MyRequest request)
    • 我的成员变量与 json 键匹配,所以我不需要使用 @SerializedName,但这是一个好点。我在那里学到了一些东西。看到这里有两个对象,MyRequest 的一个实例将如何工作?我将如何使用getMatches(MyRequest request)
    • 试试public void getMatches(@Body MyRequest request, Callback&lt;Boolean&gt; callback);我已经更新了答案。
    • 另外,虽然使用 SerializedName 与您的问题无关,但我在回答中提到了它,否则您的 POJO 变量名称必须以大写字母开头以匹配您的 json 文件。这对于 Java 和 Json 来说是不好的形式,这就是为什么我声明约定,并在“注释”中解释如何正确转换。
    猜你喜欢
    • 1970-01-01
    • 2020-03-15
    • 2022-08-22
    • 2018-11-13
    • 2020-08-28
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多