错误:无法编写JSON:类java.util.ArrayList不是映射的子类型-在Spring Application中序列化为JSON

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错误:无法编写JSON:类java.util.ArrayList不是映射的子类型-在Spring Application中序列化为JSON相关的知识,希望对你有一定的参考价值。

[发送List<List<LinkedHashMap<String, MyDTO>>>时出错,它引发JSON解析异常。我在StackOverflow中看到了相同的问题,但是没有正确的答案,或者可能是问题还不够详细。

错误:Could not write JSON: Class java.util.ArrayList not subtype of [map type; class java.util.LinkedHashMap, [simple type, class java.lang.String] -> [simple type, class com.MyDTO]];

[基本上,我想要将LinkedHashMap转换为JSON,但是顺序正在更改(同时对HashMap和LinkedHashMap进行了尝试-JSON将两者视为Map,因此顺序问题仍然存在)。要解决此问题,我现在要尝试的是将每个地图条目存储到单独的列表(List<LinkedHashMap<String, MyDTO>)中,然后将这些列表存储在单个列表中,即List<List<LinkedHashMap<String, MyDTO>>。屏幕截图-Screenshot of java data which is not converting to JSON

这里,键是一个字符串对象,值是一个DTO文件。

从Java方面,一切都很好,但是在spring应用程序中使用Jackson进行序列化时遇到问题(由@RestController转换的响应)将引发错误。

我正在使用Spring Framework的RESTful Web服务,除了这部分之外,其他一切都很好。

请告诉我如何解决它,并且不要提及未解决的其他一些问题的链接,也不要提及整个主题,因为我到处都在搜索类似的问题并且仍然感到困惑?

答案

您应该使用TypeReference这样解决此问题:

ObjectMapper m = new ObjectMapper();

List<List<LinkedHashMap<String, MyDTO>>> obj = new ArrayList<>();
LinkedHashMap<String, MyDTO> map = new LinkedHashMap<String, MyDTO>();
MyDTO myd = new MyDTO("abc");
map.put("a1", myd);
map.put("a2", new MyDTO("def"));
List<LinkedHashMap<String, MyDTO>> list = Arrays.asList(map);
obj.add(list);
// serialization succeeded
String json = m.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
System.out.println(json);

// deserialization succeeded        
ArrayList<ArrayList<LinkedHashMap<String, MyDTO>>> o = m.readValue(json, new TypeReference<ArrayList<ArrayList<LinkedHashMap<String, MyDTO>>>>(){});

System.out.println(o);

// output
[ [ {
  "a1" : {
    "name" : "abc"
  },
  "a2" : {
    "name" : "def"
  }
} ] ]

[[{a1=MyDTO [name=abc], a2=MyDTO [name=def]}]]

示例DTO类:

public class MyDTO {
    private String name;

    public MyDTO() {}

    public MyDTO(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "MyDTO [name=" + name + "]";
    }
}

以上是关于错误:无法编写JSON:类java.util.ArrayList不是映射的子类型-在Spring Application中序列化为JSON的主要内容,如果未能解决你的问题,请参考以下文章

JSON解析错误:无法构造类的实例

无法使用 Jackson ObjectMapper 将 Json 序列化为 Java 对象

AWS DynamoDB - 转换器类 - “错误请求,无法解析JSON”

反序列化类时出现“Newtonsoft.Json.JsonSerializationException 无法找到用于类型的构造函数”错误

将类对象列表保存到 JSON 文件中,以便以后读取

如何编写解析此 JSON 的 Dart 模型类?