使用Gson反序列化json数组以进行映射

时间:2013-07-24 14:57:04

标签: arrays map gson

我在json中有以下结构。

[
  {
    "Name": "FieldMapName1",
      "Fields": [
      {
        "Name": "FieldName1",
        "Values": [
          {
            "ID": 1,
            "Value": "Value1"
          },
          // ...
        ]
      },
      // ...
    ]
  },
  // ...
]

有没有办法将其转换为:

Map<String, FieldMap> fieldMap;

每个字段映射对象包含:

Map<String, Field> fields;

每个领域:

Map<Integer, String> values;

我应该编写自定义反序列化程序还是有更好的方法?

2 个答案:

答案 0 :(得分:3)

更好的方法是使用TypeToken。你的结构可以表示为(是的,通用是丑陋的):

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

然后在json中放下你的字段,如:

{"FieldMapName1":{"FieldName1":{"1":"value1", ...}},...}

然后使用它:

Map<String, Map<String, Map<Integer, String>>> map = new GsonBuilder().create().fromJson(json, t);

答案 1 :(得分:1)

你绝对无法在你要解析它的类结构中解析你的JSON,主要是因为你的JSON不代表那个类结构......

首先,您的整个JSON被[ ]包围,因此您无法将其解析为任何Map,因为Map是一个对象(由{ }包围),你想要转换成地图的其他元素也是如此......

您的JSON元素实际上将由此类结构表示:

List<FieldMap>

class FieldMap
  String Name
  List<Field> Fields

class Field
  String Name
  List<Value> Values

class Value
  int ID
  String Value

因此,您可以在此结构中解析JSON,然后将数据移动到类结构中,或者您肯定必须编写custom deserializer ...您可以找到示例here。 ..你可以尝试,如果你在创建它时遇到问题,请再次询问......