字符串到对象的转换 - 在Java 11中不起作用

Jan*_*mar 4 java-11

下面的代码片段在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");
}
Run Code Online (Sandbox Code Playgroud)

尝试在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)
Run Code Online (Sandbox Code Playgroud)

请解释一下这背后的原因和原因?另外,在Java 11中将String转换为Object的替代方法是什么?

提前致谢!

Hol*_*ger 12

消息"类[B不能转换为类[C"表示该方法正在尝试将byte[]数组转换为char[]数组.由于代码位置也有一个名称FastStringUtils.toCharArray,我可以猜到这里发生了什么.

这个课程似乎入侵了java.lang.String课堂并value在可疑的性能提升尝试中阅读了它的领域.从Java 9开始,这个内部数组是一个byte[]数组而不是一个char[]数组,这使得这个hack在运行时失败.

您需要更新版本的库或禁用该hack的配置选项(如果存在).

  • 我删除了我的答案(我确实错过了`[B`和`[C`),我确定你的答案是正确的. (3认同)