【问题标题】:Gson deserialization with customer model使用客户模型的 Gson 反序列化
【发布时间】:2013-07-01 20:27:11
【问题描述】:

我有一个必须反序列化的特定形式的 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"
 }
}

您可以前往here 以获得更好的视野。 所以,我创建了一个类来做到这一点,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,有没有办法以不同的方式完成它?

【问题讨论】:

  • 我想过添加这个 json = "{\"root\":" + json + "}" 但不是很好......

标签: java android deserialization gson json-deserialization


【解决方案1】:

Map 的使用是完美的,但您不能使用您的 JsonModel 类,因为使用该类您假设在您的 JSON 中有一个对象,其中包含一个名为 "entries" 的字段反过来代表一张地图,像这样:

{
  "entries": { the map here... }
}

你没有那个,但是你的 JSON 直接代表一个地图(不是一个对象,它的字段称为表示地图的条目!)。也就是说,你只有这个:

{ the map here... }

所以你需要相应地解析它,删除类 JsonModel 并直接使用 Map 来反序列化...

您需要使用TypeToken 来获取Map 的类型,如下所示:

Type mapType = new TypeToken<Map<String, Institution>>() {}.getType();

然后对该类型使用方法.fromJson(),如下所示:

Map<String, Institution> map = gson.fromJson(json, mapType);

【讨论】:

  • 谢谢!它现在可以工作了,但我仍然不明白为什么 HashMap 不起作用而 Map 起作用...
  • @azerto00,事实上,如果你在我的代码中将Map 替换为HashMap,我认为它应该也可以工作......它不工作?
  • 天哪,你说得对!所以,如果我确实关注了你,那行 HashMap 条目; JsonModel 类里面是错误的。而不是我不得不直接使用 TypeToken 因为没有名为“条目”的字段?
  • @azerto00,是的!看我的 2 条 JSON ......你的 JsonModel 类代表前者,但你有后者!换句话说,您的 JSON 是一个地图对象,因此您必须使用地图反序列化它,而不是使用具有地图类型属性的类...
  • 完美!再次感谢您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多