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字符串中
{
"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规则决定的。
那是不是需要每个实体类都加入这个注解吗?有一个更方便的方法,写一个父类,然后所以实体类继承这个父类,在这个父类里加入注解,就可以了。