[英]Cannot cast JSONArray to another JSONArray extended class
我在 Java 中有一个自定义 class,它扩展到 JSONArray,如下所示
public class JsonArray extends JSONArray {
public void myFunc(){}
}
现在我有一个包含 JSONArrays 的 JSONObject,我想将这些 JSONArrays 转换为我的自定义 JsonArray class,这样我就可以在其上调用myFunc()
JsonArray array = (JsonArray) jsonObj.getJSONArray(key);
array.myFunc();
但是我在日志中不断收到错误消息:
JSONArray cannot be cast to JsonArray
注意:我在 Android Studio 上运行它,这不是我的实际代码,它只是一个副本,所以在这种情况下,我们应该假设所有变量都已初始化
基本上,您尝试做的事情是行不通的。
jsonObj.getJSONArray(key)
返回的 object 显然是JSONArray
而不是JsonArray
。 并且没有类型转换会更改object 的实际类型。这在 Java 中是不可能的。在 Java 中转换为引用类型的引用类型不会更改 object 的实际 class。
如果你想安排你可以使用jsonObj.getJSONArray(key)
的结果作为你的自定义JsonArray
类型,你将必须首先使用该类型创建它。
如何?
可能使用 JSON 绑定与自定义 object 映射器。 (但我怀疑这种方法是否有效。)
可能通过使您的JsonArray
成为JSONArray
的包装器 class 。 然后这样做来包装你得到的JSONArray
实例; 例如
JsonArray array = new JsonArray(jsonObj.getJSONArray(key));
可能还有别的办法。
最好的方法将取决于您正在使用的实际 JSON 库以及您如何实例化 JSON 类...例如示例中的jsonObject
。
但是,如果您不尝试像这样子类JSONArray
,它可能会更简单。 IMO,这只会让事情变得困难。 相反,只需将myFunc
功能放入域 class 或实用程序 class 或其他东西。
更新- 如果我要使用包装器方法,我会这样做:
public class JsonArray extends JSONArray {
private JSONArray ja;
public JsonArray(JSONArray ja) {
this.ja = ja;
}
public void myFunc(){
// whatever
}
// Wrapper implementations for all of the JSONArray methods
@Override
public java.lang.Object get(int index) {
return ja.get(index);
}
// etcetera
}
您不一定需要手写所有这些。 某些 IDE 可以从您尝试包装的 class 自动生成包装器 class 的框架。
参考@StephenC 的...我决定使用他的第二个建议。
因此,向我的JsonArray class 添加一个构造函数,它将接受一个 JSONArray 的参数,然后我将 JSONArray 中的所有元素添加到 JsonArray
public JsonArray(JSONArray array) throws JSONException {
for(int i = 0; i < array.length(); i++){
String s = array.getString(i);
this.put(i, s);
}
}
用法:
JsonArray array = new JsonArray(jsonObj.getJSONArray(key));
在这里,您将创建JsonArray.java
class 并使用JSONArray
对其进行扩展。 这意味着你的JsonArray
是父 class JSONArray
的孩子。
现在您已经编写了类似的代码。
JsonArray array = (JsonArray) jsonObj.getJSONArray(key);
JsonArray
是一个孩子,而jsonObj.getJSONArray(key);
是父母。 那是个问题。
由 class 喜欢的孩子投下。
JsonArray array = (JsonArray) new JsonArray();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.