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

ohfgkhjo  于 2022-11-06  发布在  Java
关注(0)|答案(3)|浏览(228)

我尝试使用GSON库将JSON格式的http响应主体转换为Java对象,但在尝试这样做后,该对象的所有属性都等于null。
我的对象类:

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

如有任何帮助,不胜感激

eyh26e7m

eyh26e7m1#

HTTP响应的根对象是一个JSON对象,它只有一个字段-"user"。当GSON反序列化响应时,它会遍历根对象的所有字段,并将它们设置为您提供的类的相应字段。因此,它会在类User中查找字段user,并将其设置为JSON的数据。
由于User类没有user字段,GSON不填充该字段,实际上它不填充任何其他字段,因为根对象中没有其他字段。
为了解决这个问题,你需要反序列化根对象的user字段,而不是整个响应。
1.将根对象还原序列化,然后将该对象的字段user还原序列化为User类别。
你可以在@Saheed的回答中找到一个例子。但是你应该注意到它将JSON字符串转换成java对象,然后再将java对象转换回来。如果你在程序的性能敏感区域做这件事,可能会花费你额外的时间。
1.创建另一个要反序列化到的类,该类将具有字段user。它看起来像这样:

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);
b91juud3

b91juud32#

请尝试以下操作:

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

调整一下以满足您的需要

vshtjzan

vshtjzan3#

试试这个。

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

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

相关问题