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

标签 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?

最佳答案

这里不能有 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 枚举的想法(您必须始终通过重新编译等使其保持最新),那么您可以简单地将货币标记声明为 java.lang.String 并得到相同的结果:

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

关于java - 如何反序列化这个动态值 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49570359/

相关文章:

javascript - Highcharts 饼图不接受值

python - Django loaddata 验证错误

java - 如何在java中比较两个不同的JSON响应结构?

java - Gson按值对TreeMap的ArrayList进行排序

android-volley - 启用 ProGuard 规则时 Gson 解析不起作用

java - 如何在不膨胀main方法的情况下将数据加载到java程序中

java - Applet + Netty 4.0 异常初始化错误

java - 将java线程池中的线程设置为守护线程是否有任何问题

java - 如何从 Java 中的泛型类型反序列化 JSON 对象?

java - webdriver firefox 7 最大化窗口