ClassCastException при доступе к записи карты

Я столкнулся с проблемой, которую не понимаю.

Я создал небольшой пример.

package com.demo;
import java.util.Map;
import org.junit.jupiter.api.Test;
import com.fasterxml.jackson.databind.ObjectMapper;

public class DemoTest {

    @Test
    public void test1() throws Exception {
        String json = "{" + "\"a\": \"a1\"," + "\"b\": {" + "\"bb\": \"b1\"" + "}" + "}\"";

        final ObjectMapper mapper = new ObjectMapper();
        Map<String, String> myMap = mapper.readValue(json, Map.class);

        String contentA = myMap.get("a");
        System.out.println(contentA);
        String contentB = myMap.get("b");
        System.out.println(contentB);
    }
}

Красивая печать строки json

{
    "a": "a1",
    "b": {
        "bb": "b1"
    }
}

Строка System.out.println(contentA); производить
а1

Строка System.out.println(contentB); производить

java.lang.ClassCastException: класс java.util.LinkedHashMap не может быть приведение к классу java.lang.String (java.util.LinkedHashMap и java.lang.String находятся в модуле java.base загрузчика «bootstrap») по адресу com.demo.DemoTest.test1(DemoTest.java:20)

При отладке объекта myMap я вижу:

{a=a1, b = {bb=b1}}  
[0]: {a=a1, b = {bb=b1}}  
[1]: b = {bb=b1}

Я не понимаю, почему {bb=b1} обрабатывается как карта.

Я ценю вашу помощь.

Чего ты ожидаешь? Он обрабатывается как карта, потому что «bb»: «b1» — это пара ключ-значение.

Georgii Lvov 15.04.2024 20:06

Попробуйте использовать Object val = myMap.get("B"), а затем распечатайте его. Если вы ожидаете большего количества уровней, у вас должна быть итеративная логика для проверки типа и перебора его для печати всего.

Sunil Dabburi 15.04.2024 21:01

@GeorgiiLvov Я ожидаю чего-то вроде Map<String, String> myMap2 = new LinkedHashMap<String, String>(); myMap2.put("b", "{\"bb\": \"b1\"}"); System.out.println(myMap2.get("b")); = {"bb": "b1"}

Michael S 15.04.2024 22:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Значение «b» — это не строка, а (внутренний) json. Поэтому вы не можете преобразовать его в строку. Джексон пытается обратиться к этому внутреннему json, преобразуя его в LinkedHashMap, но его нельзя поместить в значение myMap, которое должно быть строкой. LinkedHashMap нельзя привести к строке, отсюда и ошибка

Я предлагаю использовать JsonNode в качестве цели преобразования.

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree(json);

Другие вопросы по теме