object轉json字串時NULL值欄位過濾及map、json互轉後map型別問題
阿新 • • 發佈:2019-02-04
HashMap<String, Fbox> map_in = new HashMap<>();
HashMap<String, Map<String, Fbox>> map_out= new HashMap<>();
上面為object型別,Fbox是個自定義物件。
現在需要把map_out儲存到redis裡去,所以先轉成json字串再放到redis裡去。
用的時候再拿出來,取出來時是json字串,轉成map型別。
之前用的是net.sf.json.JSONObject,轉出來後沒有問題,但是當用map.get("XXX")取值時,就報錯,用起來很不方便。
這裡推薦用com.alibaba.fastjson.JSONObject,非常方便
String jsonString =com.alibaba.fastjson.JSONObject.toJSONString(map_out); jedis.hset("111", "111", jsonString ); String jsonString1 = jedis.hget("111", "111"); HashMap<String, Map<String, Fbox>> parseObject = com.alibaba.fastjson.JSONObject.parseObject(jsonString1, new com.alibaba.fastjson.TypeReference<HashMap<String, Map<String, Fbox>>>(){}); HashMap<String,Fbox> map2 = new HashMap<>(); map2 = (HashMap<String, Fbox>) parseObject.get("1111"); Fbox fbox= map4.get("1");
另外轉換過程中發現實體類裡為空的欄位會預設值並體現在json字串中
網上百度了下,發現一種方式是寫jsonConfig,不過感覺不方便。{ "1111": { "1": { "orderId": 0, "count": 0, "gname": "1aa", "changeTime": 0, "t": 111, "name": "", "id": "1", "time": 0, "value": 11, "boxId": "1111", "inService": false, "reback": "N", "status": 0 }, "2": { "orderId": 0, "count": 0, "gname": "2bb", "changeTime": 0, "t": 222, "name": "", "id": "2", "time": 0, "value": 22, "boxId": "1111", "inService": false, "reback": "N", "status": 0 } } }
這裡介紹一種簡單粗暴的方式
@JsonInclude(value=JsonInclude.Include.NON_NULL)
實體類檔案頭裡加入上述,然後再測試下,就會發現null值欄位都已經過濾了。當然如果實體類裡欄位型別為long這種,null的話那還是會預設為0,這是java規則決定的。
那是不是需要每個實體類都加入這個註解嗎?有一個更方便的方法,寫一個父類,然後所以實體類繼承這個父類,在這個父類里加入註解,就可以了。