无法使用 JSON 将 JSON 响应转换为 Java 对象

Cannot convert JSON response into Java object using JSON

我正在尝试使用 GSON 库将 JSON 格式的 http 响应正文转换为 Java 对象,但是在尝试这样做之后该对象的所有属性都等于 null .

我的对象class:

public class User {
private String username;
private int shipCount;
private int structureCount;
private String joinedAt;
private int credits;

public User(String username, int shipCount, int structureCount, String joinedAt, int credits) {
    this.username = username;
    this.shipCount = shipCount;
    this.structureCount = structureCount;
    this.joinedAt = joinedAt;
    this.credits = credits;
}

加上 getter 和 setter

我尝试使用 GSON:

        Gson gso = new Gson();

        User userInf = gso.fromJson(response.body(), User.class);
        System.out.println(userInf);

响应正文是这样的:

{"user":{"username":":chrter","shipCount":0,"structureCount":0,"joinedAt":"2022-04-09T16:52:14.365Z","credits":0}}

非常感谢任何帮助

尝试这样的事情:

public static Map<String, Object> Converter(String str){
    Map<String, Object> map = new Gson().fromJson(str, new TypeToken<HashMap<String, Object>>() {}.getType());
    return map;
}

 Map<String, Object> apiResponse = Converter(response.body().toString());
Map<String, Object> username = Converter(apiResponse.get("user").toString());
System.out.println(username);

稍微调整一下以满足您的需要

试试这个。

    Map<?, ?> map = gson.fromJson(response.body(), Map.class);

    for (Map.Entry<?, ?> entry : map.entrySet()) {
        System.out.println(entry.getKey() + "=" + entry.getValue());
    }

您的 HTTP 响应的根对象是一个 JSON 对象,它只有一个字段 - "user"。当 GSON 反序列化响应时,它会遍历根对象的所有字段并将它们设置为您提供的 class 的相应字段。所以它将在classUser中查找字段user并将其设置为JSON的数据。

因为 class User 没有字段 user,GSON 不填充该字段。实际上它没有填写任何其他字段,因为根对象中没有其他字段。

要解决这个问题,您需要反序列化的不是整个响应,而是根对象的 user 字段。有两种方法。

  1. 反序列化根对象,然后将该对象的字段user反序列化为Userclass.

    您可以在@Saheed 的回答中找到如何操作的示例。但是您应该注意,它会将 JSON 字符串翻译成 java 对象,然后再将 java 对象翻译回来。如果您在程序的 performance-sensitive 区域执行此操作,可能会花费您额外的时间。

  2. 创建另一个 class 您将反序列化到其中, 具有字段用户。看起来像这样:

    class Response {
        public User user;
    };
    
    class User {
        // ...
    };
    

    然后像这样反序列化:

    Gson gso = new Gson();
    
    // CHANGE: Deserialize the response and get the user field
    Response response = gso.fromJson(response.body(),Response.class);
    User userInf = response.user;
    
    System.out.println(userInf);