最近官方宣布fastjson有漏洞,于是一波修改需求迎面扑来。总结下使用jackson的写法。
0.前置,需要定义ObjectMapper对象,才进行json的格式处理。
ObjectMapper mapper = new ObjectMapper;
1、Map对象(自己看着玩吧)转Json格式字符串
Map<String,String> map = new HashMap<>();
map.put("abc","123");
try {
System.out.println(mapper.writeValueAsString(map));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
2、从Json字符串中取出未指定的对象,相当与fastjson的JSONObject对象(JSON.parseObject(jsonString))
try {
JsonNode node = mapper.readTree(json);
System.out.println(node.get("abc"));
System.out.println(node.get("abc").toString());
System.out.println(node.get("abc").asTest());
} catch (JsonProcessingException e) {
e.printStackTrace();
}
这里可以看出直接get、get后使用toString和get后使用asTest的区别。
asTest 的结果不【""】符号,显示是123
而get和toString显示是 “123”
3、instanceof方法,在fastjson会拿他来判断取出的数据是否为json格式。(报文某个栏位的值也是json格式,判断会使用到)
try {
json = "{\"abc\":{\"a1\":\"1\",\"a2\":\"2\"},\"def\":\"123\"}";
JsonNode node = mapper.readTree(json);
System.out.println(node.get("abc").isObject());
System.out.println(node.get("abc").get("a1").isObject());
System.out.println(node.get("def").isObject());
} catch (JsonProcessingException e) {
e.printStackTrace();
}
除了isObject 判断是否是json格式的值外,还有isArray判断数组… 等等。
4、fieldNames遍历所有的key
try {
JsonNode node = mapper.readTree(json);
Iterator it = node.fieldNames();
while (it.hasNext()) {
System.out.println(it.next());
}
} catch (JsonProcessingException e) {
e.printStackTrace();
}
5、解析json返回List数据
try {
JsonNode node = mapper.readTree(json);
JsonNode listString = node.get("list");
List<对象> list = new ArrayList<>();
for (JsonNode string:listString) {
list.add(mapper.readValue(string.toString(),对象.class))
}
} catch (JsonProcessingException e) {
e.printStackTrace();
}
6、修改对象的值
try {
JsonNode node = mapper.readTree(json);
((ObjectNode)node).set("key",node.get("abc"));
} catch (JsonProcessingException e) {
e.printStackTrace();
}