首页 > 技术文章 > @RequestBody中json转换成对象失败,对象包含list属性

DiZhang 2020-02-18 17:46 原文

开发中遇到了类似的问题,网上已经有人遇到并被解决,记录之

简言之,使用@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

推荐阅读