无法使用 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
字段。有两种方法。
反序列化根对象,然后将该对象的字段user
反序列化为User
class.
您可以在@Saheed 的回答中找到如何操作的示例。但是您应该注意,它会将 JSON 字符串翻译成 java 对象,然后再将 java 对象翻译回来。如果您在程序的 performance-sensitive 区域执行此操作,可能会花费您额外的时间。
创建另一个 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);
我正在尝试使用 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
字段。有两种方法。
反序列化根对象,然后将该对象的字段
user
反序列化为User
class.您可以在@Saheed 的回答中找到如何操作的示例。但是您应该注意,它会将 JSON 字符串翻译成 java 对象,然后再将 java 对象翻译回来。如果您在程序的 performance-sensitive 区域执行此操作,可能会花费您额外的时间。
创建另一个 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);