使用Gson json轉對象(list)時,某屬性對應json值爲空,不能轉成功

主要介紹Gson,jackJson,fastJson等用法


1、gson

jar:

<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.0</version>
</dependency>

有對象

	private Object msg;
	private List<Product> result;
	private Object total;
	private Object success;

其中result是List<Product> 類型,當json中result爲空的時候,轉換失敗

public class RestResponse {
	private Object msg;
	private Object result;
	private Object total;
	private Object success;
}
public class Product {
    private String id;
    private String product;
    private String unit;
    private String attr;
    private String status;
    private Date updateTime;
}

將所有屬性定義成Object類型,如果json中還有json數組,則改字段會轉爲LinkedTreeMap數據類型。如果通過其他條件(success,total)判斷出result有轉換意義,然後再將result進行gson轉換。
代碼:

/** 可能  json對象 有的key的value爲空
	 * 	list對象設置Object 類型,經過gson轉換之後java類型爲 LinkedTreeMap,成功之後再通過gson 轉成list對象
	 * @throws Exception
	 */
	@Test
	public void json2() throws Exception{
		String json = "{\"msg\":\"true\",\"result\":[{\"attr\":\"0.0\",\"id\":\"100.0\",\"product\":\"0\",\"status\":\"297.086\",\"updateTime\":\"20170103\"},{\"attr\":\"0.0\",\"id\":\"100.0\",\"product\":\"0\",\"status\":\"162.678\"}],\"total\":60,\"success\":true}";
		RestResponse2 obj = new GsonBuilder().create().fromJson(json, RestResponse2.class);
		if("true".equals(obj.getSuccess().toString()) && (double)obj.getTotal()>0){
			List<Product> list =  new GsonBuilder().setDateFormat("yyyyMMdd").create().fromJson(obj.getResult().toString(), new TypeToken<List<Product>>(){}.getType());
			System.out.println(list);
			if(list!=null && list.size()>0){
				System.out.println(list.get(0).getUpdateTime());
				System.out.println(list.get(0).getAttr());
			}
		}
		System.out.println(obj);
		
		//對象轉json
		String obj2Json = new GsonBuilder().setDateFormat("yyyy-MM-dd").create().toJson(obj);
		System.out.println(json);
		System.out.println(obj2Json);
	}

2、fastJson
jar:

	<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.1.42</version>
        </dependency>

	@Test
	public void json2Obj() throws Exception{
		
		//json2obj
		String json = "{\"attr\":\"2\",\"updateTime\":\"2017-03-08 12:01:03\",\"id\":\"1\",\"product\":\"1\",\"status\":\"1\",\"unit\":\"2\"}";
		String jsonArray = "[{\"attr\":\"2\",\"updateTime\":\"20170308120103\",\"id\":\"1\",\"product\":\"1\",\"status\":\"1\",\"unit\":\"2\"},{\"attr\":\"2\",\"id\":\"2\",\"product\":\"1\",\"status\":\"1\",\"unit\":\"2\"}]";
		System.out.println(json);
//		JSON.DEFFAULT_DATE_FORMAT = "yyyyMMddhh:MM:dd";
		Product product = JSON.parseObject(json,Product.class);
		
		List<Product> parseObject = JSON.parseArray(jsonArray,Product.class);
		
		//obj2json
		JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
		System.out.println(JSON.toJSONString(parseObject, SerializerFeature.WriteDateUseDateFormat));
		
		
		
		System.out.println(0);
//		result:
//		{"attr":"2","updateTime":"2017-03-08 12:01:03","id":"1","product":"1","status":"1","unit":"2"}
//		[{"attr":"2","id":"1","product":"1","status":"1","unit":"2","updateTime":"2017-03-08"},{"attr":"2","id":"2","product":"1","status":"1","unit":"2"}]
	}


3、jackJson
jar:


		<dependency>
		    <groupId>com.fasterxml.jackson.core</groupId>
		    <artifactId>jackson-databind</artifactId>
		    <version>2.8.6</version>
		</dependency>


	@Test
	public void json2List() throws Exception{
		
		//json2Obj
		
		String json = "[{\"attr\":\"2\",\"updateTime\":\"2017-03-08 12:01:03\",\"id\":\"1\",\"product\":\"1\",\"status\":\"1\",\"unit\":\"2\"},{\"attr\":\"2\",\"id\":\"2\",\"product\":\"1\",\"status\":\"1\",\"unit\":\"2\"}]";
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		jackjsonMapper.setDateFormat(df);
		JavaType javaType = jackjsonMapper.getTypeFactory().constructParametricType(List.class, Product.class);
		List<Product> readValue = jackjsonMapper.readValue(json, javaType);
		System.out.println(json);
		
		//obj2Json
		System.out.println(jackjsonMapper.writeValueAsString(readValue));
		//"updateTime":1488945381232
		DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd");
		jackjsonMapper.setDateFormat(df2);
		System.out.println(jackjsonMapper.writeValueAsString(readValue));
		//"updateTime":"2017-03-08"
		
		System.out.println(0);
//		result:
//			[{"attr":"2","updateTime":"2017-03-08 12:01:03","id":"1","product":"1","status":"1","unit":"2"},{"attr":"2","id":"2","product":"1","status":"1","unit":"2"}]
//			[{"id":"1","product":"1","unit":"2","attr":"2","status":"1","updateTime":"2017-03-08 12:01:03"},{"id":"2","product":"1","unit":"2","attr":"2","status":"1","updateTime":null}]
//			[{"id":"1","product":"1","unit":"2","attr":"2","status":"1","updateTime":"2017-03-08"},{"id":"2","product":"1","unit":"2","attr":"2","status":"1","updateTime":null}]
	}



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