繁体   English   中英

无法将 JSONArray 转换为另一个扩展的 JSONArray class

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM