错误:无法编写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的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Jackson ObjectMapper 将 Json 序列化为 Java 对象
AWS DynamoDB - 转换器类 - “错误请求,无法解析JSON”
反序列化类时出现“Newtonsoft.Json.JsonSerializationException 无法找到用于类型的构造函数”错误