下面的代码段在Java 1.8中可以正常运行,但不能在Java 11 SDK中使用。
public static void main(String[] args) {
String jsonText = "{\"user\":{\"name\":\"mrhaki\",\"age\":38,\"interests\":[\"Groovy\",\"Grails\"]}}";
JsonSlurper jsonSlurper = new JsonSlurper();
Object result = jsonSlurper.parseText(jsonText);
Map jsonResult = (Map) result;
Map user = (Map) jsonResult.get("user");
String name = (String) user.get("name");
Integer age = (Integer) user.get("age");
List interests = (List) user.get("interests");
assert name.equals("mrhaki");
assert age == 38;
assert interests.size() == 2;
assert interests.get(0).equals("Groovy");
assert interests.get(1).equals("Grails");
}
尝试在Java 11中运行上述代码段时,遇到以下异常。
Exception in thread "main" java.lang.ClassCastException: class [B cannot be cast to class [C ([B and [C are in module java.base of loader 'bootstrap')
at groovy.json.internal.FastStringUtils$StringImplementation$1.toCharArray(FastStringUtils.java:88)
at groovy.json.internal.FastStringUtils.toCharArray(FastStringUtils.java:175)
at groovy.json.internal.BaseJsonParser.parse(BaseJsonParser.java:103)
at groovy.json.JsonSlurper.parseText(JsonSlurper.java:208)
at groovy.json.JsonSlurper$parseText.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at Test.main(Test.groovy:9)
请解释其背后的原因和原因? 另外,在Java 11中将String转换为Object的另一种方法是什么?
谢谢!
答案 0 :(得分:9)
消息“类[B无法转换为类[C””表示该方法正在尝试将byte[]
数组转换为char[]
数组。由于代码位置也有一个类似FastStringUtils.toCharArray
的名称,因此我可以猜测这里发生了什么。
该类似乎侵入了java.lang.String
类并阅读了value
字段,以提高性能。自Java 9以来,此内部数组是byte[]
数组,而不是char[]
数组,这使该hack在运行时失败。
您需要库的更新版本或禁用该hack(如果存在)的配置选项。