Преобразование строки в объект - не работает в Java 11 - PullRequest
0 голосов
/ 03 октября 2018

Ниже фрагмент кода отлично работает в 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?

Заранее спасибо!

1 Ответ

0 голосов
/ 04 октября 2018

Сообщение «class [B не может быть приведено к классу [C» »указывает, что метод пытается преобразовать массив byte[] в массив char[].Поскольку у местоположения кода также есть имя типа FastStringUtils.toCharArray, я могу догадаться, что здесь происходит.

Этот класс, похоже, взламывает класс java.lang.String и читает его поле value в сомнительной попытке выполненияулучшение.Начиная с Java 9, этот внутренний массив представляет собой массив byte[] вместо массива char[], что делает этот хак неудачным во время выполнения.

Вам необходима обновленная версия библиотеки или параметр конфигурации, отключающий этот хак, если он существует.

...