gpt4 book ai didi

java - 使用 GSON 将 JSON 对象转换为不同格式的 Java 对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:32:09 26 4
gpt4 key购买 nike

我有一个返回以下格式的 json 对象的响应:

{
"playerId": "001",
"name": "michel",
"age": 21,
"nation": "USA",
"ratings": [
{
"type": "speed",
"score": "0121"
},
{
"type": "accuracy",
"score": "85"
}
],
"teaminfo": {
"teamName": "HON",
"isValid": "true"
}
}

我有一个 Java 类:

public class MyRider {
public String playerId;
public String name;
public int age;
public String speed;
public String accuracy;
public String teamName;
public String isValid;
//getter, setter...
}

我想使用 GSON 将 JSON 对象映射到 Java 对象。

我尝试使用 JsonDeserializationContext 反序列化,它为 JSON 中的嵌套值返回了 null

最佳答案

没有自定义反序列化器

如果您不能更改 JSON 以返回您想要的内容,我建议您创建类来匹配它:

我的骑手:

public class MyRider {
private String playerId;
private String name;
private int age;
private String nation;
private List<Rating> ratings;
private TeamInfo teaminfo;

// getters, setters, toString override
}

评分:

public class Rating {
private String type;
private String score;

// getters, setters, toString override
}

团队信息:

private static class TeamInfo {
private String teamName;
private String isValid;

// getters, setters, toString override
}

然后简单地反序列化:

MyRider rider = gson.fromJson(json, MyRider.class);

如果您在问题中确实需要您在 MyRider 中指定的字段,请考虑使用转换器类将上面的完整类映射到您的需求。

使用自定义反序列化器

也可以使用自定义反序列化器来执行此操作,但有点没有意义,因为 GSON 为您提供了法线映射,然后您可以对其进行调整。

这是一个反序列化器的例子:

public class MyRiderDeserializer implements JsonDeserializer<MyRider> {

@Override
public MyRider deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
throws JsonParseException {
MyRider rider = new MyRider();
if(json.isJsonObject()) {
JsonObject riderObj = json.getAsJsonObject();

rider.setPlayerId(riderObj.get("playerId").getAsString());
rider.setName(riderObj.get("name").getAsString());
rider.setAge(riderObj.get("age").getAsInt());

JsonArray ratingsArray = riderObj.get("ratings").getAsJsonArray();
for(JsonElement ratingElem : ratingsArray) {
JsonObject ratingObj = ratingElem.getAsJsonObject();
String type = ratingObj.get("type").getAsString();
switch(type) {
case "speed":
rider.setSpeed(ratingObj.get("score").getAsString());
break;
case "accuracy":
rider.setAccuracy(ratingObj.get("score").getAsString());
break;
default:
break;
}
}

JsonObject teamInfo = riderObj.get("teaminfo").getAsJsonObject();
rider.setTeamName(teamInfo.get("teamName").getAsString());
rider.setIsValid(teamInfo.get("isValid").getAsString());

}
return rider;
}
}

请注意,这不包括任何检查以验证属性是否确实存在,并且是我能想到的最简单的自定义反序列化程序。要使用它,您必须在 Gson 创建时注册类型适配器:

Gson gson = new GsonBuilder()
.registerTypeAdapter(MyRider.class, new MyRiderDeserializer())
.create();

MyRider myRider = gson.fromJson(reader, MyRider.class);

关于java - 使用 GSON 将 JSON 对象转换为不同格式的 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52334004/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com