[英]Gson deserialization with customer model
我有一個必須反序列化的特定格式的json。 為了做到這一點,我想到了我最好的圖書館Gson,但是我在這里面臨一個問題,因為我有一些動態的鑰匙。
我想您會以一個很好的例子來理解。 這是json :
{
"institution1": {
"_id": "51cc7bdc544ddb3f94000002",
"announce": { },
"city": "Melun",
"coordinates": [
2.65106,
48.528976
],
"country": "France",
"created_at": "2013-06-27T17:52:28Z",
"name": "italien",
"state": "Seine et Marne",
"street": "Avenue Albert Moreau",
"updated_at": "2013-06-27T17:52:28Z"
},
"institution2": {
"_id": "51d1dfa8544ddb9157000001",
"announce": {
"announce1": {
"_id": "51d1e036544ddb9157000002",
"created_at": "2013-07-01T20:02:35Z",
"description": "description formule 1",
"institution_id": "51d1dfa8544ddb9157000001",
"title": "formule dejeune",
"type": "restoration",
"updated_at": "2013-07-01T20:02:35Z"
},
"announce2": {
"_id": "51d1e074544ddb9157000003",
"created_at": "2013-07-01T20:03:08Z",
"description": "description formule soir",
"institution_id": "51d1dfa8544ddb9157000001",
"title": "formule soiree",
"type": "restoration",
"updated_at": "2013-07-01T20:03:08Z"
}
},
"city": "Melun",
"coordinates": [
2.65106,
48.528976
],
"country": "France",
"created_at": "2013-07-01T19:59:36Z",
"name": "restaurant francais chez pierre",
"state": "Seine et Marne",
"street": "Avenue Albert Moreau",
"updated_at": "2013-07-01T19:59:36Z"
}
}
您可以去這里以獲得更好的視野。 所以,我創建了一個類JsonModel.java
public class JsonModel
{
public HashMap<String, Institution> entries;
public static class Institution
{
public String _id;
public HashMap<String, Announce> announce;
public String city;
public String country;
public List<Double> coordinates;
public String created_at;
public String name;
public String state;
public String street;
public String updated_at;
}
public static class Announce
{
public String _id;
public String created_at;
public String description;
public String institution_id;
public String title;
public String type;
public String updated_at;
}
}
然后,我要求Gson使用以下代碼反序列化該代碼:
JsonModel data = new Gson().fromJson(json, JsonModel.class);
由於數據為空,因此我認為它無法按我預期的方式運行...而且我考慮使用HashMap,因為我事先不知道諸如機構1,機構2等之類的密鑰,您對此怎么看? 我可以這樣做嗎?
而且請不要告訴我使用括號,我只是夢想擁有那些!
先感謝您 !
編輯:通過添加根對象,我能夠使此工作正常
{
"root":{ ..the json.. }
}
與變化
public HashMap<String, Institution> entries;
通過
public HashMap<String, Institution> root;
所以,問題是gson需要識別第一個元素,但實際上我將無法修改json,有沒有辦法以不同的方式完成它?
Map
的使用是完美的,但是您不能使用JsonModel
類,因為使用該類,您假設在JSON中有一個對象,該對象包含一個名為"entries"
的字段,該字段又表示地圖,例如這個:
{
"entries": { the map here... }
}
而且您沒有那個,但是您的JSON直接代表了一個地圖( 而不是一個具有名為entry的字段的對象,它代表一個地圖! )。 即,您只有以下內容:
{ the map here... }
因此,您需要相應地對其進行解析,刪除類JsonModel
並直接使用Map
進行反序列化...
您需要使用TypeToken
來獲取Map
的類型,如下所示:
Type mapType = new TypeToken<Map<String, Institution>>() {}.getType();
然后使用該類型的.fromJson()
方法,如下所示:
Map<String, Institution> map = gson.fromJson(json, mapType);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.