Jackson常用注解学习

Java中jackson常用注解 Java中jackson常用注解 @JsonProperty - 字段命名 @JsonPropertyOrder - 字段序列化顺序 @JsonAlias - 字段别名,反序列化 @JsonIgnore -序列化时忽略字段 @JsonIgnoreProperties - 序列化时忽略某些字段 @JsonInclude - 序列化时作用于满足条件的 @JsonFormat - 设置格式,如日期时间等 @JacksonInject - 反序列化时注入到java对象 阅读详情

读写注解

@JsonProperty(value = "***")

属性使用的注解,用来表示外部属性名字,就时使用别名序列化,而不是对象的属性名

public class Student {

    private int id;

    @JsonProperty("s_name")
    private String name;

    private int age;

    private boolean gender;
。。。
}

请求时使用:

{"id":12,"s_name":"zhangsan","age":11,"gender":true}

@JsonAutoDetect:实体类使用的注解,用于设置实体类属性的自动发现机制,发现的字段才能被序列和反序列;(自己的理解:对象的反序列化和setter方法,或者构造方法有关系,序列化和getter方法有关系)

默认情况下:先去查看被public修饰的字段,如果没有用public修饰,但拥有public修饰的getter、setter方法也能被发现;

自动检测,(作用在类上)来开启/禁止自动检测。

fieldVisibility:字段的可见级别   

ANY:任何级别的字段都可以自动识别  

NONE:所有字段都不可以自动识别   

NON_PRIVATE:非private修饰的字段可以自动识别  

PROTECTED_AND_PUBLIC:被protected和public修饰的字段可以被自动识别   

PUBLIC_ONLY:只有被public修饰的字段才可以被自动识别     

DEFAULT:可见的设置都会被发现,包括继承的属性;(自己测试好像都能检测到)

@Jsonignore

作用在字段或者方法上,在序列化和反序列化时,忽略一个字段;

@JsonIgnoreProperties

作用在类上,可以指定多个字段忽略

@JsonIgnoreType

作用在类上,忽略这个类,不会被序列化和反序列化

读注解

@JsonAnySetter(对应的写注解时@JsonAnyGetter)

用于接收实体类没有的属性,主要使用在set方法(set方法必须有两个参数)和属性上

public class Student {

    private int id;

    private String name;

    private int age;

    private boolean gender;
    @JsonAnySetter
    private Map<String,Object> properties = new HashMap<>();


    public Map<String, Object> getProperties() {
        return properties;
    }
    //@JsonAnySetter
    public void setProperties(String fieldName,Object value) {
        this.properties.put(fieldName,value);
    }
。。。
}

@JsonCreator

作用于方法,通常用来标注构造方法或静态工厂方法上,使用该方法来构建实例,默认的是使用无参的构造方法,通常是和@JsonProperty或@JacksonInject配合使用

public static class TestPOJO{
	private String name;
	private int age;

	@JsonCreator
	public TestPOJO(@JsonProperty("full_name") String name,@JsonProperty("age") int age){
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public int getAge() {
		return age;
	}
}
--------------------------------------------------------------------------
public enum SessionInteractionType {


    GIFT,
  
    GAME,
   
    PROP;

    @JsonCreator
    public static SessionInteractionType forValue(int value) {
        return values()[value];
    }

    @JsonValue
    public int toValue() {
        return ordinal();
    }
}

@JacksonInject

作用于属性、方法、构造函数上,用来反序列化时标记已经被注入的属性,注入时需要手动注入的。

public class PersonInject {

    public long   id   = 0;
    public String name = null;

    @JacksonInject
    public String source = null;

}
InjectableValues inject = new InjectableValues.Std().addValue(String.class, "jenkov.com");
PersonInject personInject = new ObjectMapper().reader(inject)
                        .forType(PersonInject.class)
                        .readValue(new File("data/person.json"));

@JsonDeserialize(对应的写注解是@JsonSerialize)

作用于方法和字段上,通过Converter进行自定义的转化。Converter是jackson包中的一个接口,子接口有StdConverter;

public class CurrencyRate {
  private String pair;
  private double rate;
  @JsonSerialize(converter = LocalDateTimeToStringConverter.class)
  @JsonDeserialize(converter = StringToLocalDatetimeConverter.class)
  private LocalDateTime lastUpdated;
    .............
}
public class LocalDateTimeToStringConverter extends StdConverter<LocalDateTime, String> {
  static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);

  @Override
  public String convert(LocalDateTime value) {
      return value.format(DATE_FORMATTER);
  }
}

注:DateTimeFormatter是线程安全的;

public class StringToLocalDatetimeConverter extends StdConverter<String, LocalDateTime> {

  @Override
  public LocalDateTime convert(String value) {
      return LocalDateTime.parse(value, LocalDateTimeToStringConverter.DATE_FORMATTER);
  }
}

注:java8中时间的应用

        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd kk:mm:ss");
        String format = dateTimeFormatter.format(now);
        System.out.println("format = " + format);
        String format1 = now.format(dateTimeFormatter);
        System.out.println("format1 = " + format1);
        格式化时上边两种方式效果一样
        String nowString = "2019-05-09 10:40:27";
        LocalDateTime.parse(nowString,dateTimeFormatter);
        解析时上边的方法返回的时LocalDateTime
        而dateTimeFormatter.parse方法的返回值类型是TemporalAccessor(此类型是一个接口)需要强转

写注解

@JsonInclud

可以过滤属性的值,null,empty不进行序列化

@JsonAnyGetter

@JsonPropertyOrder

作用在类上,被用来指明当序列化时需要对属性做排序

alphabetic属性,布尔类型,表示是否采用字母拼音顺序排序,默认是false,即不排序

@JsonRawValue

写入原始的值

例:字段 Sting content字段;接受一个json

使用

ObjectMapper.writeValueAsString();方法

当使用注解是content='{"author":"Peter", "content":"Test content"}'}

不使用注解的是

content":"{\"author\":\"Peter\", \"content\":\"Test content\"}"}

及序列化后的效果不一样;

@JsonValue

序列化时,调用方法序列化

@JsonSerialize

 

-------------------------------------------------------------------------------------------------------------------------------

常用的java序列化的注解

@Enumerated

属性value的值默认是:

EnumType.ORDINAL表示Emum的下表序列(从0开始)

可以修改为

EnumType.STRING表示Emum的对应的字符串

@Convert

用于数据库属性类型与java存储的类型做转换,例如枚举类型,在存储到数据库时或者在数据库取出来时,不用手动转换。

必须实现接口AttributeConverter<X,Y>

package javax.persistence;
 
public interface AttributeConverter<X,Y> {

	public Y convertToDatabaseColumn (X attribute);
 
	public X convertToEntityAttribute (Y dbData);
}

convertToDatabaseColumn(X attribute)用于把输入的类型转成数据库存储的类型

convertToEntityAttribute (Y dbData) 用于把数据库搜出来的类型转成实体中想要的类型

package com.xhx.springboot.enums;
 
public enum GenderEnum{
    MAN("1","男"),WOMAN("2","女");
    GenderEnum(String code,String value){
        this.code = code;
        this.value = value;
    }
    private String code;
    private String value;
    private String description;
 
    public String getCode() {
        return this.code;
    }
    public String getValue() {
        return this.value;
    }
    public String getDescription() {
        return this.description;
    }
 
}
package com.xhx.springboot.converters;
 
import com.xhx.springboot.enums.GenderEnum;
 
import javax.persistence.AttributeConverter;
import java.util.Arrays;
 
public class GenderEnumConverter implements AttributeConverter<GenderEnum,String> {
    @Override
    public String convertToDatabaseColumn(GenderEnum genderEnum) {
        return genderEnum.getCode();
    }
 
    @Override
    public GenderEnum convertToEntityAttribute(String s) {
        return Arrays.stream(GenderEnum.values()).filter(en -> en.getCode().equals(s)).findFirst().orElse(null);
    }
}
package com.xhx.springboot.entity;
 
import com.xhx.springboot.converters.GenderEnumConverter;
import com.xhx.springboot.enums.GenderEnum;
 
import javax.persistence.*;
 
/**
 * @author xuhaixing
 * @date 2018/4/28 10:29
 */
@Entity
@Table(name = "USER")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private int id;
    private String name;
    private int age;
    @Convert(
            converter = GenderEnumConverter.class
    )
    private GenderEnum gender;
    @Version
    private int version;
 。。。。。。
}

@Converter

用在AttributeConverter的实现类上

里面有autoApply属性

如果autoApply的属性是ture,则所有实体类的相关属性都会与本转化器关联;

如果autoApply的属性是false,则需要转换的属性必须添加@Convert注解与Converter进行关联

Jackson核心操作类ObjectMapper

线程安全的ObjectMapper

ObjectMapper类提供了很多方法操作JSON,这个类是线程安全的,推荐是用单例,注入方式,保证对象能够复用

还有其他类:JsonParser,JsonGenerator等,用这些类可以很容易的从String,File,Streams,URL等读取和写入JSON。

注意:在JSON序列化和反序列化的时候,会调用对象的getter/setter方法。所以需要在处理对象上要加上getter/setter,否则会出错。

Object对象转Json

方法:

  1. writeValue()
  2. writeValueAsBytes()
  3. writeValueAsString()
  4. .writeWithDefaultPrettyPrinter().writeValueAsString()  格式化输出

JSON转为Object

方法:

  • readValue(str,User.class)

用Reader反序列化Josn,转Object对象

jackson可以用抽象类Reader类BufferedReader,CharArrayReader,FilterReader,InputStreamReader,PipedReader,StringReader,反序列化Json数据

@Test
public void jsonToUserByReader() throws IOException {
  String str = "{\n"
    + "  \"id\" : 1,\n"
    + "  \"name\" : \"liuhailin\",\n"
    + "  \"createDate\" : 1509537316534,\n"
    + "  \"money\" : 100.001\n"
    + "}";

  Reader reader = new StringReader( str );
  User user = mapper.readValue( reader, User.class );
  System.out.println( user );
}

JSON转HashMap

@Test
public void jsonToUserMap() throws IOException {
  String str = "{\n"
    + "  \"id\" : 1,\n"
    + "  \"name\" : \"liuhailin\",\n"
    + "  \"createDate\" : 1509537316534,\n"
    + "  \"money\" : 100.001\n"
    + "}";

  HashMap userMap = mapper.readValue( str, HashMap.class );
  System.out.println( userMap.get( "id" ) );
  System.out.println( userMap.get( "name" ) );
  System.out.println( userMap.get( "createDate" ) );
  System.out.println( userMap.get( "money" ) );
}

从文件/流中读取 JSON

@Test
public void jsonToUserFromInputStreamReader() throws IOException {
  File userFile = new File( "user.json" );
  InputStream inputStream = new FileInputStream( userFile );
  InputStreamReader inputStreamReader = new InputStreamReader( inputStream, Charset.forName( "utf8" ) );
  User user = mapper.readValue( inputStreamReader, User.class );
  System.out.println( user );
}

InputStreamReader可以设定编码

@Test
public void jsonToUserFromByteArray() throws IOException {
  String str = "{\n"
    + "  \"id\" : 1,\n"
    + "  \"name\" : \"liuhailin\",\n"
    + "  \"createDate\" : 1509537316534,\n"
    + "  \"money\" : 100.001\n"
    + "}";
  byte[] array = str.getBytes();

  User user = mapper.readValue( array, User.class );
  System.out.println( user );
}

 

参考:牛人的博客

jackson注解JsonAlias的使用(为字段、参数指定反序列化别名) 1.源码 @Target({ElementType.ANNOTATION_TYPE,ElementType.FIELD, ElementType.METHOD,ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @JacksonAnnotation public @interface JsonAlias { /** * 可以接受一个或多个辅助名称作为正式名称的别名 */ public Strin. 阅读详情

相关推荐

OsgEarth实战:飞机模型动态轨迹与雷达扫描效果实现详解

本文详细介绍了如何使用OsgEarth实现飞机模型动态轨迹与雷达扫描效果。通过实战案例,讲解了模型加载、路径规划、动态轨迹绘制、飞行姿态计算以及雷达扫描效果的实现方法,并提供了性能优化技巧,帮助开发者高效完成三维可视化项目开发。

weixin_29214199的博客 303

jackson常用注解

1、@JsonAutoDetect 自动检测,(作用在类上)来开启/禁止自动检测。 fieldVisibility:字段的可见级别 ANY:任何级别的字段都可以自动识别 NONE:所有字段都不可以自动识别 NON_PRIVATE:非private修饰的字段可以自动识别 PROTECTED_AND_PUBLIC:被protected和public修饰的字段可以被自动识别 PUBLIC_ONLY:只有被public修饰的字段才可以被自动识别 DEFAULT: ...

永不停歇的人 5063

RK3588嵌入式开发:从零构建Rockit多媒体处理引擎的实战指南

本文详细介绍了如何在RK3588嵌入式平台上从零构建Rockit多媒体处理引擎的实战指南。涵盖开发环境搭建、工具链配置、源码编译流程、硬件加速优化及典型问题解决方案,帮助开发者高效利用RK3588的NPU和VPU加速特性,实现高性能多媒体处理应用。

mango的博客 186

Jackson 常用注解

@JacksonInject通过 @JacksonInject 注解可以在 Jackson 反序列化的时候为空值字段动态赋值,当反序列化的对应属性值不存在时,可通过该注解为其动态设置值。@Getter @Setter public class User { @JacksonInject(value="dynamic") privateString...

天行健,君子以自强不息;地势坤,君子以厚德载物。 1261

机器学习算法原理:详细介绍各种机器学习算法的原理、优缺点和适用场景

现在,我们将进入到机器学习的核心部分——算法原理。在本篇文章中,我们将详细探讨各种机器学习算法的原理、优缺点和适用场景。

a871923942的博客 2965

华为OD机试新系统真题【计算电动车续航里程】

华为OD机试 新系统真题【计算电动车续航里程】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【计算电动车续航里程】多语言题解。

qq_45776114的博客 781

Jackson常用注解详解

Jackson是Java中广泛使用的JSON处理库,提供了多种强大的注解来控制JSON序列化和反序列化。主要注解包括:@JsonProperty用于字段映射,@JsonIgnore用于忽略字段,@JsonFormat用于日期格式化,@JsonInclude控制属性包含条件,@JsonCreator指定构造函数,@JsonValue自定义序列化表示,@JsonIgnoreProperties忽略多个属性。这些注解使开发者能够精确控制JSON转换过程,提高代码可读性和可维护性,适用于各种复杂的JSON处理场景。

shyの个人笔记 1769

【WorkBuddy专栏14】专家不是「换皮」——角色切换、训练机制与自我进化深度拆解

WorkBuddy专栏14】专家不是「换皮」——角色切换、训练机制与自我进化深度拆解

AI人人懂 591

jackson学习之七:常用Field注解

虽然标题说是常用Field注解,其实上图中的这些注解也能用在方法上,只不过多数情况下这些注解修饰在field上更好理解一些,例如JsonIgnore,放在field上和get方法上都是可以的;| git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 || 项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |

2401_89840885的博客 865

【Unity】 预制体Prefab使用说明

在 Unity 中,Prefab 是一个可以预先制作并重复使用的 GameObject 或组件集合,Prefab 中的 GameObject 可以有子对象和其他组件。

灵境引路人 2849

仿真学习系列(四十三):Sigrity仿真之平面谐振分析

在 SIGRITY 中,平面谐振分析(Plane Resonance Analysis)是一种用于分析信号完整性(SI)问题的高级仿真方法,尤其关注于层间电磁波的传播、谐振现象和信号衰减等问题。平面谐振分析通常用于电源分配网络(PDN)、信号线和参考平面之间的相互作用。本文将详细介绍如何在 SIGRITY 中进行平面谐振分析,并提供一些实用的分析方法与步骤,帮助工程师们识别和优化可能存在的设计问题。

案例文章,高速信号 480

jackson图_jackson学习之六:常用类注解

欢迎访问我的GitHubhttps://github.com/zq2599/blog_demos内容:所有原创文章分类和汇总,及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;本篇概览本文是《jackson学习》系列的第六篇,继续学习jackson强大的注解能力,本篇学习的是常用的类注解,并通过实例来加深印象,下图是常用类注解的简介:接下来逐个学习;源码下载如果您不想编...

weixin_32512933的博客 370

【图像超分】论文精读:RepSR: Training Efficient VGG-style Super-Resolution Networks with Structural Re-Paramete

摘要: 本文提出RepSR,一种基于结构重新参数化和批量归一化(BN)的高效VGG式超分辨率网络。针对SR任务中BN易引发伪影的问题,作者通过分析发现训练-测试阶段的不一致性是主因,并提出先使用小批量统计训练、后期切换为总体统计的优化策略。RepSR块设计包含干净的残差路径和带改进BN的扩展-压缩卷积路径,有效平衡了训练非线性与推理效率。实验表明,RepSR在不同模型规模下优于现有重参数化方法,且实际推理速度更快。该工作为SR提供了性能与效率兼优的解决方案,相关代码未开源。 关键词: 超分辨率、结构重参数化

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 303

jackson学习之六:常用类注解(1)

git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 || git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 || 项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |DEFAULT // 默认的,用于继承父类的自动识别的范围。

2401_86359318的博客 943

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jackson学习之六:常用类注解

git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 || git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 || 项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |DEFAULT // 默认的,用于继承父类的自动识别的范围。

2401_86359330的博客 474

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jackson学习之八:常用方法注解

就写到这了,也算是给这段时间的面试做一个总结,查漏补缺,祝自己好运吧,也希望正在求职或者打算跳槽的 程序员看到这个文章能有一点点帮助或收获,我就心满意足了。多思考,多问为什么。希望小伙伴们早点收到满意的offer!越努力越幸运!金九银十已经过了,就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。

2401_84048398的博客 434

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

jackson学习之八:常用方法注解(1)

如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了《Java中高级核心知识全面解析》” />如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了《Java中高级核心知识全面解析》[外链图片转存中…(img-3xO4c0Kw-1711369297342)]

2301_79055240的博客 1012
上一篇: Spring框架学习记录
下一篇: Spring容器的refresh
Mosqiote
博客等级 码龄9年 26粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值