我最近开始使用Java,来自Perl,Ruby,JavaScript和bash的长期背景,我从服务中获取JSON对象并希望用Java处理它。
我的JSON对象如下所示:
{
"stores": {
"store": [
{
"id": 123,
"name": "My Store Name",
"address": {...},
"locationNumber": 4567,
"storeNumber": 890,
"divisionId": "7",
"schedule": {...},
"attributes": {...},
"features": {...},
...
我有一个服务模块,它返回商店的JSONArray,我能够通过以下表达式获取我想要的数据:
storesData.getJSONObject(i).getString("name") + "\n";
要么
Assert.assertTrue(attributes.getJSONObject(j).getJSONArray("value").get(0).equals("TRUE"))
现在我想从数组中选择一个商店(按名称)并返回另一个JSONArray,只将该商店作为数组中的唯一元素。所以我编码了这个:
for(int i = 0; i < storesData.length(); i++) {
JSONObject jObj = storesData.get(i);
---
但它没有说storesData.get(i)不是JSONObject。我不得不像这样投射结果:
JSONObject jObj = (JSONObject) storesData.get(i);
即使在调试器(IntelliJ-IDEA)中,这一行:
storesData.get(i).getClass()
报告了一类JSONObject。更新截图Screenshot
到底发生了什么事?
如果storesData.get(i).getClass()
不等于JSONObject
或至少JSONObject
child类,那么在运行时会得到ClassCastException。
你的storesData
返回类型不是JSONObject
,而是JSONObject
甚至Object
的祖先。单击Idea中的storesData
,然后转到变量声明以查看其类型。
更多例子:
class A {
static Object getInstance() {
return "invalid object";
}
}
class B extends A {
static A getInstance() {
return new B()
}
}
B b = B.getInstance(); // compilation error
A a = B.getInstance(); // works
B b = (B) B.getInstance(); // works as well
A a = A.getInstance(); // compilation error
A a = (A) A.getInstance(); // ClassCastException
你想在java中阅读有关ClassCasting的内容。