如何反序列化这个动态值JSON?

时间:2018-03-30 07:36:32

标签: java json gson retrofit2

我想反序列化以下JSON(原来大约有100 Exchange个动态值:

{
  "Exchange1": {
    "EUR": [
      "CNY",
      "USD"
    ],
    "INR": [
      "USD",
      "CNY"
    ]
  },
  "Exchange2": {
    "BRL": [
      "EUR",
      "USD",
      "INR"
    ],
    "JPY": [
      "USD",
      "EUR",
      "CNY"
    ]
  },
  ....
}

我正在使用http://www.jsonschema2pojo.org/但它正在生成一个带有文字值(“Exchange1”,“EUR”等)的Java类,而我需要迭代它,无论动态字符串值是什么:

enter image description here

如何用Java描述这个JSON?

1 个答案:

答案 0 :(得分:1)

你不能在这里(在理智的意义上)拥有POJO,但人们倾向于使用POJO生成器,即使对于动态对象也不会进行提前分析。 "动态"通常应使用java.util.Map映射对象(有序实现)+可以使用java.util.Set(有序实现)映射唯一值。 因此,如果您有货币的自定义枚举,请说明

enum Currency {

    BRL,
    CNY,
    EUR,
    INR,
    JPY,
    USD,

}

然后您可以轻松定义映射,而不需要任何看起来不适用的POJO:

private static final Type exchangesType = new TypeToken<Map<String, Map<Currency, Set<Currency>>>>() {
}.getType();
final Map<String, Map<Currency, Set<Currency>>> exchanges = gson.fromJson(jsonReader, exchangesType);
System.out.println(exchanges);

所以琐碎的toString()输出如下:

  

{Exchange1 = {EUR = [CNY,USD],INR = [USD,CNY]},Exchange2 = {BRL = [EUR,USD,INR],JPY = [USD,EUR,CNY]}}

如果你不喜欢Currency枚举的想法(你必须始终保持最新的重新编译等),那么你可以简单地将货币标记声明为{{1}并获得相同的结果:

java.lang.String
private static final Type exchangesType = new TypeToken<Map<String, Map<String, Set<String>>>>() {
}.getType();