![](/img/trans.png)
[英]Is it possible to deserialize JSON property names with periods as a nested object using GSON?
[英]How can I deserialize JSON to Java Object using GSON when the JSON using dates as property names?
我有一個要使用GSON反序列化的JSON響應。 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
為每個條目創建了一個新的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
實例。
希望能幫助到你! :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.