弃掉fastjson,改回jackson

记得年前升级过一次fastjson,版本1.2.60,安全要求用到fastjson的全部升级,结果一扫一大片,用的人还真不少。许多使用springboot整体打包的同事,都是升级fastjson后重新打包,上传,重新发布应用。

小编所在部门相关springboot项目都进行了jar包分离(参见:如何分离构建业务jar,配置文件,第三方依赖jar),升级只是替换了一个fastjson的jar包,然后重启应用。可是这没过多久,安全再次要求升级fastjson了,这次改换使用jackson了,使用起来同样简单明了,性能差异也并不明显。

下面记录几个小编在项目中常用的场景:

1.对象转json字符串

javaObjectMapper mapper = new ObjectMapper();
String jsonPerson = mapper.writeValueAsString(new Person("码农小麦",25));
System.out.println(jsonPerson);
#结果:{"name":"码农小麦","age":25,"birthday":"2000-06-01 00:00:00"}

2.json字符串转对象

Person person = mapper.readValue(jsonPerson,Person.class);
System.out.println(person);
#结果:Person{name='码农小麦',age=25,birthday=Thur June 01 00:00:00 CST 2000}

3.直接构建json字符串

JsonNodeFactory jsonNodeFactory = JsonNodeFactory.instance;
ObjectNode objectNode = jsonNodeFactory.objectNode();
objectNode.put("name","码农小麦");
objectNode.put("age",25);
System.out.println(objectNode.toString());

4.直接解析json字符串

JsonNode jsonNode = mapper.readTree(objectNode.toString());
System.out.println(String.format("name: %s, age: %d",
        jsonNode.get("name").asText(),jsonNode.get("age").asInt(0)));

5.使用json数组

ObjectNode resultNode = jsonNodeFactory.objectNode();
resultNode.put("code",200);
ArrayNode arrayNode = resultNode.putArray("data");
ObjectNode dataNode = jsonNodeFactory.objectNode();
dataNode.put("name","码农小麦1");
dataNode.put("age",25);
arrayNode.insert(1,dataNode);
ObjectNode dataNode1 = jsonNodeFactory.objectNode();
dataNode1.put("name","码农小麦2");
dataNode1.put("age",25);
arrayNode.insert(2,dataNode1);
System.out.println(resultNode.toString());
#结果:{"code":200,"data":[{"name":"码农小麦1","age":25},
             {"name":"码农小麦2","age":25}]}

6.日期转换

默认转换为json字符串会将对象日期转换为Long型的毫秒数,可以使用注解进行格式化。

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

接口间传输日期,最好还是使用Long型毫秒数,前后端转换都很方便。

7.注解
jackson提供许多注解方便用户定制json转换,如@JsonIgnore转换时忽略此注解标注的属性,@JsonProperty转换时指定属性名称等。

上一篇:fastJSON 使用总结


下一篇:【转】FastJson、Jackson、Gson进行Java对象转换Json的细节处理