使用复杂的 JSON 改造 POST 请求

Posted

技术标签:

【中文标题】使用复杂的 JSON 改造 POST 请求【英文标题】:Retrofit POST request with a complex JSON 【发布时间】:2015-05-09 14:10:12 【问题描述】:

我是 Retrofit 的新手,正在尝试使用 Retrofit 发出 POST 请求。我的 POST 请求的主体是复杂的 JSON,如下所示:

有效载荷:


    "user": 
        "personal_info": 
            "first_name": "Walter",
            "last_name": "White",
            "date_of_birth": "1972-01-03 00:00:00 PST"
        ,
        "address_info": 
            "address_1": "308 NEGRA ARROYO LANE",
            "address_2": "#",
            "city": "ALBUQUERQUE",
            "state": "NM",
            "zip_code": "87104"
        ,
        "contact_info": 
            "email": "wwhite@test.com",
            "telephone": "88888888888",
            "telephone_type_id": 1
        ,
        "employment_info": 
            "employer_name": "SELF",
            "employment_status_id": 7,
            "annual_income": 9000000000000000,
            "monthly_income": 750000000000,
            "employment_start_year": 0,
            "employment_start_month": 0
        
      
    

我将接口定义为

    @POST("/users")
    void registerUser(@Body User User, Callback<User> cb);

我不确定我的 User 类应该是什么样子,我希望有效负载与上面提到的相同,到目前为止我的 User 类为

public class User 


    @SerializedName("personal_info")
    private PersonalInfo personalInfo;
    @SerializedName("address_info")
    private AddressInfo addressInfo;
    @SerializedName("contact_info")
    private ContactInfo contactInfo;
    @SerializedName("employment_info")
    private EmploymentInfo employmentInfo;


我不确定 Personalinfo、ContactInfo 等是否应该是具有 JSON 请求中提到的所有字段的单独类,还是应该将它们作为 User 类中的内部类以及如何使用 User 类进行 Retrofit 调用。服务器响应与上面提到的 JSON 请求完全相似,带有 1 个附加字段,即用户 ID。我已准备好 POJO 类以获取响应。

我对如何发出 POST 请求感到困惑。提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

序列化后的User 对象将具有此 JSON 表示:


    "personal_info": 
        "first_name": "Walter",
        "last_name": "White",
        "date_of_birth": "1972-01-03 00:00:00 PST"
    ,
    "address_info": 
        "address_1": "308 NEGRA ARROYO LANE",
        "address_2": "#",
        "city": "ALBUQUERQUE",
        "state": "NM",
        "zip_code": "87104"
    ,
    "contact_info": 
        "email": "wwhite@test.com",
        "telephone": "88888888888",
        "telephone_type_id": 1
    ,
    "employment_info": 
        "employer_name": "SELF",
        "employment_status_id": 7,
        "annual_income": 9000000000000000,
        "monthly_income": 750000000000,
        "employment_start_year": 0,
        "employment_start_month": 0
    

为了构建问题中指出的有效负载,您需要另一个类:

public class UserRequest 

    @SerializedName("user")
    private User user;

并在使用 Retrofit 执行请求时使用它:

@POST("/users")
void registerUser(@Body UserRequest User, Callback<User> cb);

【讨论】:

谢谢,正如我提到的,服务器响应与上面提到的请求完全相同。是否可以使用相同的模型类来解析服务器响应,或者我应该为响应设置单独的模型类。 拜托,你能告诉我如何写用户类(我的用户类是这个公共类用户公共字符串标题=“发送报告”;公共字符串时间戳=“02072015123700”;公共字符串类型= "Image"; int FilesNumber = 1; ) ,是对还是错,以及如何编写回调(我在回调中取回json),提前谢谢 @RajanMaurya 你应该为此提出一个新问题。【参考方案2】:

使用 GSON,无论您将这些类设置为***类还是内部类都没有区别,它在这两种情况下都可以正常工作。您的代码看起来不错,应该可以正常工作。

【讨论】:

我可以使用同一个 POJO 类来处理响应吗?

以上是关于使用复杂的 JSON 改造 POST 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 的改造请求中传递 JSON 对象并检索 JSON 对象?

改造 2 POST JSON 对象,响应给出错误代码 400,消息 = nul

POST 请求后保存 JSON 响应的特定值

改造 POST 响应转换失败,无影无踪

django:使用 json 对象测试基于 POST 的视图

如何使用 Root POST 改造返回 JSON