簡體   English   中英

客戶模型的Gson反序列化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM