使用Gson在动态密钥对象内部使用动态密钥对象解析JSON

时间:2017-04-29 12:30:46

标签: java android json gson

我是android的新手,我有一个带动态键的JSON文件,如下所示:

{
  "x": {
    "a": {
      "1": [1,2,3,4],
      "2": [1,2,3,4]
    },
    "b": {
      "1": [1,2,3,4],
      "2": [1,2,3,4]
    }
  },
  "y": {
    "a": {
      "1": [1,2,3,4],
      "2": [1,2,3,4]
    },
    "b": {
      "1": [1,2,3,4],
      "2": [1,2,3,4]
    }
  },
  "z": {
    "a": {
      "1": [1,2,3,4],
      "2": [1,2,3,4]
    },
    "b": {
      "1": [1,2,3,4],
      "2": [1,2,3,4]
    }
  }
}

我通过JSONObject成功解析了它,但我必须通过x,y,z上的键Iterator循环。每次,我必须循环a,b和“1”和“2”相同。我认为这不是一个好的解决方案。我为他们创建了这样的模型:

Class XYZ {
private String name; // "x", "y", "z" value
private ArrayList<ABC> abcList;
}

Class ABC {
private String name; // "a", "b", "c"
private ArrayList<Item> itemList;
}

Class Item{
private String ID; // "1", "2"
private int[] valueArray;
}

任何人都可以帮我解析Gson的这个json,我觉得它看起来更专业:D。非常感谢你

1 个答案:

答案 0 :(得分:0)

您的模型无法映射您的JSON,因为Gson默认配置显然无法匹配。

您可以使用两种“默认”方式:

静态

...因为你没有真正提到为什么你的JSON被认为是动态的:

final class XYZ {

    final ABC x = null;
    final ABC y = null;
    final ABC z = null;

}
final class ABC {

    final OneTwo a = null;
    final OneTwo b = null;

}
final class OneTwo {

    @SerializedName("1")
    final List<Integer> one = null;

    @SerializedName("2")
    final List<Integer> two = null;

}

示例:

try ( final Reader reader = getPackageResourceReader(Q43695739.class, "dynamic.json") ) {
    final XYZ xyz = gson.fromJson(reader, XYZ.class);
    System.out.println(xyz.x.b.two);
}

动态(通过反序列化)

...假设您的密钥是动态的,但结构保持不变:

private static final Type stringToStringToStringToIntegerListType = new TypeToken<Map<String, Map<String, Map<String, List<Integer>>>>>() {
}.getType();
try ( final Reader reader = getPackageResourceReader(Q43695739.class, "dynamic.json") ) {
    final Map<String, Map<String, Map<String, List<Integer>>>> m = gson.fromJson(reader, stringToStringToStringToIntegerListType);
    System.out.println(m.get("x").get("b").get("2"));
}

动态(通过JSON树)

另一种真正的动态方法可能对某些情况有所帮助。另请注意,JSONObject不在Gson领域:您可能从org.json包中导入了这个。 Gson使用像JsonElementJsonObject等骆驼名称。

try ( final Reader reader = getPackageResourceReader(Q43695739.class, "dynamic.json") ) {
    final JsonElement jsonElement = gson.fromJson(reader, JsonElement.class)
            .getAsJsonObject()
            .getAsJsonObject("x")
            .getAsJsonObject("b")
            .getAsJsonArray("2");
    System.out.println(jsonElement);
}

第一个和第二个示例生成java.util.List个实例

  

[1,2,3,4]

第三个示例返回JsonArray实例,其实现略有不同{/ 1}:

  

[1,2,3,4]