Java 如何通过改造android发布请求和获取响应(嵌套JSON)

Java 如何通过改造android发布请求和获取响应(嵌套JSON),java,android,api,rest,retrofit,Java,Android,Api,Rest,Retrofit,下面是嵌套的JSON请求 { "user": { "email": "123@mail.com", "password": "12345678" } } 下面是嵌套的JSON响应 { "data": { "renew_token": "e994c4d2-d93b-47e8-ab5f-9090b823

下面是嵌套的JSON请求

{
"user": {
    "email": "123@mail.com",
    "password": "12345678"
    }
}
下面是嵌套的JSON响应

{
    "data": {
        "renew_token": "e994c4d2-d93b-47e8-ab5f-9090b823f249",
        "token": "419fff70-b1ee-4ea7-b636-ddbec6346794"
    }
}
我可以发布请求,但我很难在同一过程中编写响应代码

我的界面当前

public interface JsonApi {

    @POST("session")
    Call<RootUser> userLogin(@Body RootUser rootUser);
}
API调用

private void userLogin(){
        String email = etloginemail.getText().toString();
        String password = etloginpassword.getText().toString();

        Retrofit retrofit = new Retrofit.Builder().baseUrl("https://the-digest-app.herokuapp.com/api/")
                                        .addConverterFactory(GsonConverterFactory.create())
                                        .build();

        JsonApi jsonApi = retrofit.create(JsonApi.class);

        User user = new User(email, password);
        RootUser rootUser = new RootUser(user);

        Call<RootUser> call = jsonApi.userLogin(rootUser);

        call.enqueue(new Callback<RootUser>() {
            @Override
            public void onResponse(Call<RootUser> call, Response<RootUser> response) {
                Toast.makeText(LoginActivity.this, "Success", Toast.LENGTH_LONG).show();
                         }

            @Override
            public void onFailure(Call<RootUser> call, Throwable t) {
                Toast.makeText(LoginActivity.this, "Error", Toast.LENGTH_LONG).show();
            }
        });

    }
private void userLogin(){
字符串email=etloginemail.getText().toString();
字符串密码=etloginpassword.getText().toString();
改装改装=新改装.Builder().baseUrl(“https://the-digest-app.herokuapp.com/api/")
.addConverterFactory(GsonConverterFactory.create())
.build();
JsonApi=reformation.create(JsonApi.class);
用户=新用户(电子邮件、密码);
RootUser RootUser=新的RootUser(用户);
Call Call=jsonApi.userLogin(rootUser);
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
Toast.makeText(LoginActivity.this,“Success”,Toast.LENGTH_LONG.show();
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Toast.makeText(LoginActivity.this,“Error”,Toast.LENGTH_LONG.show();
}
});
}

如何定义get response函数?如果我做错了什么,请告诉我

您应该为响应多创建一个POJO,如

public class LoginResponse{
    @SerializedName("renew_token")
    public String renewToken;
    @SerializedName("token")
    public String token;
}

public class UserLoginResponse{
    public LoginResponse data;
}
你的改装界面应该是这样的

public interface JsonApi {

    @POST("session")
    Call<UserLoginResponse> userLogin(@Body RootUser rootUser);
}
公共接口JsonApi{
@会后
调用userLogin(@Body RootUser RootUser);
}
以及您的呼叫实现

call.enqueue(new Callback<UserLoginResponse>() {
            @Override
            public void onResponse(Call<UserLoginResponse> call, Response<UserLoginResponse> response) {
                Toast.makeText(LoginActivity.this, "Success", Toast.LENGTH_LONG).show();
                         }

            @Override
            public void onFailure(Call<UserLoginResponse> call, Throwable t) {
                Toast.makeText(LoginActivity.this, "Error", Toast.LENGTH_LONG).show();
            }
        });
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
Toast.makeText(LoginActivity.this,“Success”,Toast.LENGTH_LONG.show();
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Toast.makeText(LoginActivity.this,“Error”,Toast.LENGTH_LONG.show();
}
});

我已经创建了POJO并编辑了界面,您能帮我调用get响应吗?我很挣扎,因为它是嵌套的json格式。我编辑了我的答案并添加了实现。谢谢你的帮助!如果我的问题不够清楚,很抱歉,但我实际上是在请求将响应“token”和“renew_token”存储在类LoginResponse中的代码。如果你能帮忙,我将不胜感激!没关系,我已经弄明白了。没有你的帮助是不可能的:)你的请求和响应是不同的!你需要像@mehmet说的那样改变pojo。我们怎么知道的?请求和响应都包含两个字符串类型的键,但都有不同的键名!
call.enqueue(new Callback<UserLoginResponse>() {
            @Override
            public void onResponse(Call<UserLoginResponse> call, Response<UserLoginResponse> response) {
                Toast.makeText(LoginActivity.this, "Success", Toast.LENGTH_LONG).show();
                         }

            @Override
            public void onFailure(Call<UserLoginResponse> call, Throwable t) {
                Toast.makeText(LoginActivity.this, "Error", Toast.LENGTH_LONG).show();
            }
        });