访问Map条目时出现ClassCastException

问题描述 投票:0回答:1

我遇到了一个我不明白的问题。

我创建了一个小例子。

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); 产生
a1

System.out.println(contentB); 产生

java.lang.ClassCastException:类 java.util.LinkedHashMap 不能 转换为类 java.lang.String (java.util.LinkedHashMap 和 java.lang.String 位于加载程序“bootstrap”的 java.base 模块中) 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}被处理为Map

感谢您的帮助。

java jackson jackson-databind
1个回答
0
投票

“b”的值不是字符串,而是(内部)json。 所以你不能真正将它转换为字符串。 Jackson 尝试通过将其转换为

LinkedHashMap
来解决这个内部 json,但它不能放入
myMap
的值中,该值必须是字符串。
LinkedHashMap
无法转换为 String 因此出现错误

© www.soinside.com 2019 - 2024. All rights reserved.