性能比较:笔者看多很多的关于这三个类库的性能测试,总结如下:
fastjson为人诟病的问题:虽然fastjson速度上有一定的优势,但是其为了追求速度,很大程度放弃了JSON的规范性。因此还时不时的在有些版本中暴露安全问题。大家如果有机会去看一下fastjson的github代码,其代码质量不是很高。所以用不用fastjson在国内软件界还是有争议的,在国外基本没人用。
jackson主要的作用是:
什么叫序列化与反序列化?说白了就是把对象转成可传输、可存储的格式(json、xml、二进制、甚至自定义格式)叫做序列化。反序列化顾名思义。
所以我们下面就给大家介绍一下jackson的常用注解的使用方法,帮助我们进行序列化和反序列化工作。
这些注解通常用于标注java实体类或实体类的属性。
@JsonPropertyOrder(value={"content","title"})
public class Article {
@JsonIgnore
private Long id;
@JsonProperty("auther")
private String author;
private String title;
private String content;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
private List<Reader> reader;
}
上文代码中对应的JSON数据格式可以为:
{
auther :"",
content:"",
title:"",
createTime:"2019-10-20 12:12:12",
reader:[{"name":"dhy","age":18},{"name":"xpy","age":18}]
}
通常会对日期类型转换,进行全局配置,而不是在每一个java bean里面配置
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
除了在spring框架内实现自动的前后端JSON数据与java对象的转换,我们还可以使用jackson自己写代码进行转换。
//jackson的ObjectMapper 转换对象
ObjectMapper mapper = new ObjectMapper();
//将某个java对象转换为JSON字符串
String jsonStr = mapper.writeValueAsString(javaObj);
//将jsonStr转换为Ademo类的对象
Ademo ademo = mapper.readValue(jsonStr, Ademo.class);
当JSON字符串代表的对象的字段多于类定义的字段时,使用readValue会抛出UnrecognizedPropertyException异常,在类的定义处加上@JsonIgnoreProperties(ignoreUnknown = true)可以解决这个问题。
在有些版本JsonFormat注解(比如:Spring Boot 2.3.0.RELEASE),不能生效。我经过反复的实验,为实体类增加一个无参的构造函数和一个全参的构造函数,JsonFormat注解就生效了
在Spring框架内使用Jackson的时候,通常需要一些特殊的全局配置,来应对我们JSON序列化与反序列化中出现的各种问题。
Spring Boot 提供了两种配置方式,一是配置文件的方式
spring:
jackson:
#日期类型格式化
date-format: yyyy-MM-dd HH:mm:ss
serialization:
#格式化输出,通常为了节省网络流量设置为false。因为格式化之后会带有缩进,方便阅读。
indent_output: false
#某些类对象无法序列化的时候,是否报错
fail_on_empty_beans: false
#设置空如何序列化,见下文代码方式详解
defaultPropertyInclusion: NON_EMPTY
deserialization:
#对象json中有不存在的属性时候,是否报错
fail_on_unknown_properties: false
parser:
#允许出现特殊字符和转义符
allow_unquoted_control_chars: true
#允许出现单引号
allow_single_quotes: true
二是通过代码的方式,方式一更容易,方式二更灵活。方式一无法解决的问题,尝试使用方式二。
@Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder)
{
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
// 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
// Include.Include.ALWAYS 默认
// Include.NON_DEFAULT 属性为默认值不序列化
// Include.NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。这样对移动端会更省流量
// Include.NON_NULL 属性为NULL 不序列化
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 允许出现特殊字符和转义符
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
// 允许出现单引号
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
// 字段保留,将null值转为""
objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>()
{
@Override
public void serialize(Object o, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider)
throws IOException
{
jsonGenerator.writeString("");
}
});
return objectMapper;
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/m0_53157173/article/details/121516791
内容来源于网络,如有侵权,请联系作者删除!