当前位置:   article > 正文

Jackson&Fastjson使用技巧_因此fastjson2和jackson这两个json序列化器默认是没有注册的,如果要使用请自行做

因此fastjson2和jackson这两个json序列化器默认是没有注册的,如果要使用请自行做

JSON相关

1.Jackson

///注解大全
/1. 序列化注解///
1.1 @JsonAnyGetter // @JsonAnySetter相反效果
class ExtendableBean {
    public String name;
    public Map<String, String> properties;
    @JsonAnyGetter
    public Map<String, String> getProperties() {
        return properties;
    }
    public ExtendableBean(String name) {
        this.name = name;
        properties = new HashMap<>();
    }
    public void add(String key, String value){
        properties.put(key, value);
    }
}
序列化后的结果: {"name":"My bean","attr2":"val2","attr1":"val1"}
1.2 @JsonPropertyOrder
    该注解可以指定实体属性序列化后的顺序,该注解有一个参数alphabetic, 如果为true, 表示按字母顺序序列化
1.3 @JsonRawValue
    注解可以让Jackson在序列化时把属性的值原样输出 (json字符串仍为该字符串)
1.4 @JsonValue /一般结合enum类型使用,例如只序列化code
    该注解作用于一个方法, 并且只用被注解的方法序列化整个实体对象
1.5 @JsonRootName
    如果wrapping是使能(enabled), 那么该注解用来指定root wrapper的名称
    @JsonRootName(value = "user")
    public class UserWithRoot {
        public int id;
        public String name;
    }
	UserWithRoot user = new UserWithRoot();
    user.id = 1;
    user.name = "jackma";
	ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
    String result = objectMapper.writeValueAsString(user);
    System.out.println(result);
序列化的结果:{"user":{"id":1,"name":"jackma"}}而不是UserWithRoot
    //Jackson .2.4版本开始, 新增了一个可选参数namespace, 该属性对json没效果, 但是对xml起作用
    @JsonRootName(value = "user", namespace = "alibaba")
    <user xmlns="alibaba">
		<id xmlns="">1</id>
		<name xmlns="">jackma</name>
	</user>
1.6 @JsonSerialize //@JsonDeserialize相反效果
(常用于字段时枚举类型时自定义序列化器)
该注解用于指定一个自定义序列化器(custom serializer)来序列化实体例的某属性
用@JsonSerialize的参数using指明实体类属性eventDate的序列化器是CustomDateSerializer:
public class CustomDateSerializer extends StdSerializer<Date> {
    private static SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
    public CustomDateSerializer() { this(null); } 
    public CustomDateSerializer(Class<Date> t) { super(t); }
    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider arg2) 
    	throws IOException, JsonProcessingException {
        gen.writeString(formatter.format(value));
    }
}
序列化结果: {"name":"party","eventDate":"2019-08-19 04:28:00"}
而如果没有@JsonSerialize注解的序列化结果是: {"name":"party","eventDate":1566203280000}
1.7 @JsonAlias 别名的值都可以映射给该属性
该注解在反序列化过程中为属性定义一个或多个别名
    
 ///2.属性注解/// 
2.1 @JsonIgnoreProperties
    该注解是一个类级别的注解, 标记一个或多个属性被Jackson忽略
2.2 @JsonIgnore
    该注解用于属性级别, 用于标明一个属性可以被Jackson忽略
2.3 @JsonIgnoreType
	该注解标记类型是注解作用的类型的属性都会被忽略
	必须作用于类, 标明以该类为类型的属性都会被Jackson忽略
2.4 @JsonInclude
    该注解在序列化时会排除属性值是空值(empty或null)、没有默认值的属性。
可作用在类和属性上
2.5 @JsonProperty 属性或get/set方法上
    该注解可以指定属性在Json字符串中的名字
2.6 @JsonFormat //一般配合@DateTimeFormat一起使用
    该注解指定序列化日期和时间时的格式
    shape: 表示序列化后的一种类型,枚举(详见后)
	pattern: 表示日期的格式
	timezone: 默认是GMT,中国需要GMT+8
	locale: 根据位置序列化的一种格式
/3其他注解
3.3 @JsonUnwrapped
    该注解指定值在序列化和反序列化时, 去除对应属性的外包装(根节点)
    public class UnwrappedUser {
    public int id;
    @JsonUnwrapped
    public Name name;
    	public static class Name {
        public String firstName;
        public String lastName;
    	}
	}
	{
    	"id":1,
    	"firstName":"John",
    	"lastName":"Doe"
    }	
3.4 @JsonManagedReference, @JsonBackReference
    这两个注解配合使用, 可以解决两个不同类的属性的父子关系(parent/child relationships)和循环引用(work around loops)
使用@JsonBackReference可以在序列化时阻断循环引用, 原理是忽略被注解的属性, 否则会导致异常
@JsonBackReference注释的不会序列化  
3.5 @JsonFilter
    该注解可以在序列化时指定一个过滤器
    //这里添加了一个SimpleBeanPropertyFilter.filterOutAllExcept过滤器, 该过滤器的含义是除name属性外, 其他属性都被过滤掉(不序列化) 
    public void whenSerializingUsingJsonFilter_thenCorrect()  throws JsonProcessingException {
    BeanWithFilter bean = new BeanWithFilter(1, "My bean"); 
    FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter",    
     						SimpleBeanPropertyFilter.filterOutAllExcept("name")); 
    String result = new ObjectMapper().writer(filters).writeValueAsString(bean);
	}
3.6 @JsonAppend
    该注解用来给一个被序列化的对象添加一个虚拟属性:添加一个version
    @JsonAppend(attrs = {@JsonAppend.Attr(value = "version")})
3.7 @JsonNaming //ps使用这个属性值必须严格规范否则有问题 例如appClientId使用大小写转换则app_client_id,r如果想要转为app_clientId则可以再使用@JsonProperty
    该注解用来在序列化时选择一个属性命名习惯来代替默认属性名. 
	KEBAB_CASE: 属性名单词用短线分隔连接, 比如hello-world
	LOWER_CASE: 属性名用小写字母而且没有分隔符, 比如helloworld
	SNAKE_CASE: 属性名用小写字母而且用下划线做分隔符, 比如hello_world
	UPPER_CAMEL_CASE: 属性名所有单词用大写开头而且没有分隔符, 比如HelloWorld
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123

注意点

//@JsonFormat(Jackson)和 @DateTimeFormat(Spring)注解区别及作用/
@JsonFormat注解的作用是格式化时间类型数据传输时的格式,以自己想要的格式来展示日期,同时也设置时区,避免时间展示与想要的结果产生误差。
@DateTimeFormat注解作用则是将前端传来的字符串类型的日期转为后台需要的时间类型结果,不加此注解,请求会报错400,请求参数错误,对于此类错误要注意int类型数据传输也是一样
  • 1
  • 2
  • 3

2.fastjson

<dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.78</version>
</dependency>
//注解
@JSONField 有name,format, serialize, deserialize,serializerFeature,parseFeatures, label, jsonDirect 几种参数。
1.name 指定JSON序列化的字段名称
2.format 指定字段的格式,对日期格式有用
3.serialize 是否序列化
4.serializerFeature 通过SerializerFeature对生成的json格式的数据进行一些定制,比如可以输入的格式更好看,使用单引号而非双引号等,是使用SerializerFeature枚举中的指定序列化方式
5.parseFeatures 决定了解析器是否将自动关闭那些不属于parser自己的输入源 ,见Feature
6. label 给属性打上标签, 相当于给属性进行了分组
7.jsonDirect 你有⼀个字段是字符串类型,⾥⾯是json格式数据,你希望直接输⼊,⽽不是经过转义之后再输出 将这个值置为true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/834089
推荐阅读
相关标签
  

闽ICP备14008679号