@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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章