gpt4 book ai didi

java - 当 JSON 使用日期作为属性名称时,如何使用 GSON 将 JSON 反序列化为 Java 对象?

转载 作者:行者123 更新时间:2023-12-01 11:36:53 26 4
gpt4 key购买 nike

我有一个 JSON 响应,我想使用 GSON 对其进行反序列化。 JSON 结构使用日期字符串作为属性名称。如何反序列化这样的内容。

{
2015-04-23: [{
seqNum: 1,
distance: 13,
start: "123 Main St"
end: "225 Broadway"
},
{seqNum: 2
distance: 21,
start: "225 Broadway"
end: "12 West St"
}
]
}

最佳答案

在我的回答中,我认为你可以有这样的 JSON 响应:

{
"2015-04-23": [
{
"seqNum": 1,
"distance": 13,
"start": "123 Main St",
"end": "225 Broadway"
},
{
"seqNum": 2,
"distance": 21,
"start": "225 Broadway",
"end": "12 West St"
}
],

"2015-04-24": [
{
"seqNum": 1,
"distance": 13,
"start": "123 Main St",
"end": "225 Broadway"
},
{
"seqNum": 2,
"distance": 21,
"start": "225 Broadway",
"end": "12 West St"
}
]
}

因此第一步是创建适当的类。

class MyObject {
private List<DateMapping> dateMappings;

public MyObject(List<DateMapping> dateMappings) {
this.dateMappings = dateMappings;
}
...
}
class DateMapping {
private Date date;
private List<Sequence> sequences;

public DateMapping(Date date, List<Sequence> sequences) {
this.date = date;
this.sequences = sequences;
}
...
}

class Sequence {
private int seqNum;
private int distance;
private String start;
private String end;
...
}

现在如何解析动态键?答案是使用自定义解串器:

class MyObjectAdapter implements JsonDeserializer<MyObject> {

private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
private static final Type listSequenceType = new TypeToken<List<Sequence>>(){}.getType();

public MyObject deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
List<DateMapping> dateMappings = new ArrayList<>();
for(Map.Entry<String, JsonElement> entry : json.getAsJsonObject().entrySet()) {
try {
dateMappings.add(new DateMapping(dateFormat.parse(entry.getKey()), context.deserialize(entry.getValue(), listSequenceType)));
} catch (ParseException e) {
e.printStackTrace();
throw new RuntimeException("Can't parse the date");
}
}
return new MyObject(dateMappings);
}
}

从那里您可以看到我迭代了顶级 JsonObject 的每个条目。您可以从中创建一个新的 DateMapping对于每个条目。然后您只需在 Gson 解析器中注册适配器即可。

Gson gson = new GsonBuilder().registerTypeAdapter(MyObject.class, new MyObjectAdapter()).create();
MyObject myObject = gson.fromJson(new FileReader(new File("myJson")), MyObject.class);

运行上面的示例会产生输出:

MyObject => 
DateMapping Thu Apr 23 00:00:00 CEST 2015, sequences=[Sequence{seqNum=1, distance=13, start='123 Main St', end='225 Broadway'}, Sequence{seqNum=2, distance=21, start='225 Broadway', end='12 West St'}]
DateMapping Fri Apr 24 00:00:00 CEST 2015, sequences=[Sequence{seqNum=1, distance=13, start='123 Main St', end='225 Broadway'}, Sequence{seqNum=2, distance=21, start='225 Broadway', end='12 West St'}]

如果您只有一个条目,则可以跳过类 MyObject 的创建,并获取 JsonObject 的第一个条目您可以从中创建一个 DateMapping实例。

希望对您有帮助! :)

关于java - 当 JSON 使用日期作为属性名称时,如何使用 GSON 将 JSON 反序列化为 Java 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29877970/

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