@RequestBody中json转换成对象失败,对象包含list属性
开发中遇到了类似的问题,网上已经有人遇到并被解决,记录之
简言之,使用@RequestBody注解接受对象A的json数据时,如果A内有一个list属性 C为另一对象:
json:
{
"filedB":"filedBValue",
"listC":[
{"filedD":"filedDValue1","filedE":"filedEValue1"},
{"filedD":"filedDValue2","filedE":"filedEValue2"}
]
}
//接受json的方法
@PostMapping(value="/test")
public String test(@RequestBody A a){
//dosomething
}
情形一:
如果A对象和C对象是分开的类,不会出现问题:
public class A {
private String filedB;
private List<C> listC;
//getter setter 忽略
}
public class C{
private String filedD;
private String filedE;
...
}
情形二 内部类
如果想要使用C作为A的内部类,以下格式会出现问题:
public class A {
private String filedB;
private List<C> listC;
public class C{
private String filedD;
private String filedE;
...
}
//getter setter 忽略
}
会报如下错:
org.springframework.http.converter.HttpMessageNotReadableException:...
解决方法:
JSON反序列化失败的原因是序列化框架不知道C是内部类,所以创建对象失败了,修改C为静态内部类。
public class A {
private String filedB;
private List<C> listC;
public static class C{
private String filedD;
private String filedE;
...
}
//getter setter 忽略
}
update:
注意test2方法的注释:
import com.alibaba.fastjson.JSON;
import org.junit.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestJson {
@Test
public void test1() {
Map<String, Object> map = new HashMap<>();
map.put("filedA", "A");
map.put("filedB", "B");
Map<String, Object> mapinner = new HashMap<>();
mapinner.put("innerfiledA", "1");
mapinner.put("innerfiledB", "2");
List list = new ArrayList();
list.add(mapinner);
map.put("filedC", list);
String jsonString = JSON.toJSONString(map);
System.out.println(jsonString);
}
/**
* 如果接口接受的时并不是以对象json化传参,那么要以String类型来接受,并自己解析,
* 注意:::不能自己定义对象,将类似 {"filedA":"A","filedB":"B","filedC":[{"innerfiledA":"1","innerfiledB":"2"}]}
* 转成自己定义的对象
*/
@Test
public void test2() {
String str = "{\"filedA\":\"A\",\"filedB\":\"B\",\"filedC\":[{\"innerfiledA\":\"1\",\"innerfiledB\":\"2\"}]}";
Map<String, Object> objectMap = (Map<String, Object>) JSON.parse(str);
String filedA = (String) objectMap.get("filedA");
String filedB = (String) objectMap.get("filedB");
List<Map<String, Object>> filedC = (List<Map<String, Object>>) objectMap.get("filedC");
for (Map<String, Object> map : filedC) {
String innerfiledA = (String) map.get("innerfiledA");
String innerfiledB = (String) map.get("innerfiledB");
System.out.println("filedA= "+filedA);
System.out.println("filedB= "+filedB);
System.out.println("innerfiledA= "+innerfiledA);
System.out.println("innerfiledB= "+innerfiledB);
}
}
}
更多:
https://segmentfault.com/q/1010000008543157
https://blog.csdn.net/justry_deng/article/details/80972817