在json-io中读取数组:Object不能转换为List

问题描述 投票:0回答:1

我正在使用这个库:https://github.com/jdereg/json-io

这是我尝试做的一个简化示例,重现错误:

import com.cedarsoftware.util.io.JsonReader;

Map args = new HashMap();
args.put(JsonReader.USE_MAPS, true);
List<String> a = (List<String>)JsonReader.jsonToJava("[\"1.1\",\"1.2\"]", args);

运行时,抛出:

java.lang.ClassCastException:class [Ljava.lang.Object;不能强制转换为类java.util.List([Ljava.lang.Object;而java.util.List在加载器'bootstrap'的模块java.base中)

或者,可以省略args(删除两个中间线并删除argsjsonToJava参数)具有相同的效果。

阅读字典/地图工作正常,例如此代码按预期打印“example”:

Map<String,Object> fields = (Map<String,Object>)JsonReader.jsonToJava("{\"example\":true}");
for (Map.Entry<String,Object> field : fields.entrySet()) {
    System.out.println(field.getKey());
}

这是唯一一个我无法弄清楚如何阅读的数组。我能够为图书馆找到的文档非常简洁,并没有显示出这样的例子。跟踪源代码以查看它应该是什么类型的对象,我最终在一个名为readArray的函数中,它在内部使用了一个ArrayList:https://github.com/jdereg/json-io/blob/master/src/main/java/com/cedarsoftware/util/io/JsonParser.java#L280。看起来我正在做的应该是可以转换为List(我也尝试过ArrayList以确定)。

java arrays json
1个回答
1
投票

java.lang.ClassCastException:class [Ljava.lang.Object;无法强制转换为类java.util.List

请注意,[Ljava.lang.Object表示对象数组的数组类型,因此它是Object[]。由于json数组可以包含任何内容,即字符串,布尔值,数字,对象或数组,并且在任何组合中任何JSON解析器都有3个选项:

  • 使用Object作为数组的元素类型。这将导致你的情况下Object[]
  • 使用用户提供的某些数组元素类型,即如果您知道数组将只包含字符串,那么您将告诉解析器它应该生成String[]结果。如果数组包含除了很可能会失败的字符串以外的任何内容。
  • 复杂的解析器可能首先收集元素,确定它们的类型并尝试使用最特殊的常见类型(如果所有元素都是String的字符串)。但是,API无法反映这一点,因为编译器不知道json在运行时将包含什么。因此,API只能使用前两个选项(在Jackon或Gson等许多库中都存在),因此用户必须自己投射数组或元素,在这种情况下,几乎无法获得解析器那么复杂。

现在你可能会问为什么解析器返回Object[]而不是List<Object>。这是由该图书馆的设计师做出的决定,我只能猜出原因是什么。但是,json本身只知道数组,因此如果没有提供其他类型信息,逻辑结果也是使用Java数组。

© www.soinside.com 2019 - 2024. All rights reserved.