我想反序列化以下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类,而我需要迭代它,无论动态字符串值是什么:
如何用Java描述这个JSON?
答案 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();