zoukankan      html  css  js  c++  java
  • @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

  • 相关阅读:
    js遍历table,gridview
    JavaScript和Webservice实现联动
    DataTable应用
    POJ1039+几何+直线于线段相交
    POJ2398+几何+排序
    HDU4506+快速求幂
    HDU4536+DFS
    POJ3304+几何
    POJ3555+几何+半平面交
    HDU4544+优先队列
  • 原文地址:https://www.cnblogs.com/DiZhang/p/12544750.html
Copyright © 2011-2022 走看看