Java中对JSON结构的解码已经得到回答,我已经将其用于几个简单的结构,但这似乎有些棘手。 (我没有花太多时间在开发Java代码上,所以我可能在这里错过了一些特定于语言的东西,我也可能错了)
{
"who": "123",
"mapping": {
"element1": {
"element11": {
"relation": "rel1",
"direction_p2c": true,
"element111": {
"relation": "rel2",
"direction_p2c": true,
"element1111": {
"relation": "rel1",
"direction_p2c": false
},
"element1112": {
"relation": "rel1",
"direction_p2c": false
},
"element1113": {
"relation": "rel1",
"direction_p2c": false
}
},
"element112": {
"relation": "rel3",
"direction_p2c": false
}
},
"element12": {
"relation": "rel1",
"direction_p2c": true,
"element121": {
"relation": "rel2",
"direction_p2c": true,
"element1211": {
"relation": "rel1",
"direction_p2c": false
}
}
}
},
"element2": {
"element21": {
"relation": "rel2",
"direction_p2c": true
},
"element22": {
"relation": "rel3",
"direction_p2c": true
},
"element23": {
"relation": "rel1",
"direction_p2c": true
}
}
}
}
上面是提到的结构,我正在使用Gson
进行解码,下面是我正在尝试的方法,
void recursive(String key, HashMap<String, Object> value) {
for (Map.Entry<String, Object> entry: value.entrySet()) {
recurssive(entry.getKey(), (HashMap<String, Object>) entry.getValue());
}
}
HashMap<String, Object> decodedJson = new Gson().fromJson(inputJson, HashMap.class);
recursive("mapping", (HashMap<String, Object>) decodedJson.get("mapping"));
在第一个recursive
函数调用中,我在运行时遇到以下错误
javax.servlet.ServletException: java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to java.util.HashMap
我还没有使用JsonParser
用Parse a nested JSON using gson中定义的方式尝试这种方法,但是对此进行解码的任何输入都是值得的。
答案 0 :(得分:2)
用java.util.Map
界面替换java.util.HashMap
类。它由Gson的LinkedTreeMap
实现,因此不会触发ClassCastException
。
void recursive(String key, Map<String, Object> value) {
...
}
Map<String, Object> decodedJson = new Gson().fromJson(inputJson, Map.class);
...
答案 1 :(得分:1)
Gson
类LinkedTreeMap
扩展了AbstractHashMap
,它在内部实现了Map
接口。
Gson
使用LinkedTreeMap
而不是HashMap
。由于您要将对象强制转换为HashMap
,这是无法完成的(因为它不在层次结构中),因此ClassCastException
如@Karol所述,将HashMap
替换为Map
,一切正常。