使用复杂的 JSON 改造 POST 请求

Retrofit POST request with a complex JSON

我是 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);

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

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 请求中提到的所有字段分开 class,或者我应该将它们作为内部 class用户 class 以及如何与用户 class 进行 Retrofit 调用。服务器响应与上面提到的 JSON 请求完全相似,带有 1 个附加字段,即用户 ID。我已经准备好 POJO classes 来获取响应。

我对如何提出 POST 请求感到困惑。在此先感谢您的帮助。

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

A 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
    }
}

为了按照问题中的指示构建有效负载,您需要另一个 class:

public class UserRequest {

    @SerializedName("user")
    private User user;
}

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

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