Я столкнулся с проблемой, которую не понимаю.
Я создал небольшой пример.
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} обрабатывается как карта.
Я ценю вашу помощь.
Попробуйте использовать Object val = myMap.get("B")
, а затем распечатайте его. Если вы ожидаете большего количества уровней, у вас должна быть итеративная логика для проверки типа и перебора его для печати всего.
@GeorgiiLvov Я ожидаю чего-то вроде Map<String, String> myMap2 = new LinkedHashMap<String, String>(); myMap2.put("b", "{\"bb\": \"b1\"}"); System.out.println(myMap2.get("b")); = {"bb": "b1"}
Значение «b» — это не строка, а (внутренний) json.
Поэтому вы не можете преобразовать его в строку.
Джексон пытается обратиться к этому внутреннему json, преобразуя его в LinkedHashMap
, но его нельзя поместить в значение myMap
, которое должно быть строкой. LinkedHashMap
нельзя привести к строке, отсюда и ошибка
Я предлагаю использовать JsonNode в качестве цели преобразования.
ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree(json);
Чего ты ожидаешь? Он обрабатывается как карта, потому что «bb»: «b1» — это пара ключ-значение.