1. 程式人生 > >object轉json字串時NULL值欄位過濾及map、json互轉後map型別問題

object轉json字串時NULL值欄位過濾及map、json互轉後map型別問題

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字串中

比如Integer、Double等型別會預設0。下面是轉換後的字串,name為null,也會體現在字串中
{
  "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
    }
  }
}
網上百度了下,發現一種方式是寫jsonConfig,不過感覺不方便。

這裡介紹一種簡單粗暴的方式

@JsonInclude(value=JsonInclude.Include.NON_NULL)

實體類檔案頭裡加入上述,然後再測試下,就會發現null值欄位都已經過濾了。當然如果實體類裡欄位型別為long這種,null的話那還是會預設為0,這是java規則決定的。

那是不是需要每個實體類都加入這個註解嗎?有一個更方便的方法,寫一個父類,然後所以實體類繼承這個父類,在這個父類里加入註解,就可以了。