@JSONField和@JsonProperty注解的使用说明及对比

news/2025/1/16 5:53:47/

使用示例

@JSONField

@JSONField注解是阿里巴巴的fastjson框架中的注解,用于指定JSON字符串中的属性名和Java对象中的属性名之间的映射关系

1. name属性

通过name属性可以指定将Java对象中的属性名映射为JSON对象中的属性名。默认情况下,JSON对象中的属性名与Java对象中的属性名相同

示例:

public class User {@JSONField(name = "id")private int userId;private String name;private int age;
}

在上面的例子中,使用@JSONField注解将Java对象中的userId属性映射为JSON对象中的id属性

2. format属性

通过format属性可以指定日期类型属性的格式,以及将数字类型转为字符串类型的格式

示例:

public class User {private String name;private int age;@JSONField(format = "yyyy-MM-dd")private Date birthday;@JSONField(format = "#,###.00")private double salary;
}

在上面的例子中,使用@JSONField注解指定了birthday属性的日期格式为“yyyy-MM-dd”,salary属性的数字格式为“#,###.00”

3. serialize属性

通过serialize属性可以控制属性是否序列化到JSON对象中

当serialize属性为false时,属性将不会序列化到JSON对象中,默认为true

示例:

public class User {@JSONField(serialize = false)private int userId;private String name;private int age;
}

在上面的例子中,使用@JSONField注解将userId属性从序列化中排除

4. deserialize属性

通过deserialize属性可以控制是否将JSON对象中的属性反序列化到Java对象中

当deserialize属性为false时,该属性将不会从JSON对象中反序列化到Java对象中,默认为true

示例:

public class User {private int userId;private String name;@JSONField(deserialize = false)private int age;
}

在上面的例子中,使用@JSONField注解将age属性从反序列化中排除

5. ordinal属性

通过ordinal属性可以指定属性的顺序

默认情况下,属性的顺序是按照属性在Java对象中的顺序排列的

示例:

public class User {@JSONField(ordinal = 2)private String name;@JSONField(ordinal = 1)private int age;
}

在上面的例子中,使用@JSONField注解指定了age属性的顺序为1,name属性的顺序为2

6. defaultValue属性

通过defaultValue属性可以指定属性在Java对象中的默认值

示例:

public class User {@JSONField(defaultValue = "0")private int userId;@JSONField(defaultValue = "N/A")private String name;private int age;
}

在上面的例子中,使用@JSONField注解指定了userId属性的默认值为0,name属性的默认值为“N/A”

7. type属性

通过type属性可以指定属性的类型

示例:

public class User {private int userId;@JSONField(type = FieldType.STRING)private int age;
}

在上面的例子中,使用@JSONField注解指定了age属性的类型为字符串类型

8. jsonDirect属性

通过jsonDirect属性可以指定属性是否应该直接输出为JSON字符串

默认情况下,属性将被转化为字符串并以引号标记输出

示例:

public class User {private String name;@JSONField(jsonDirect = true)private String jsonMessage;
}

在上面的例子中,使用@JSONField注解指定了jsonMessage属性应该直接输出为JSON字符串

9. parseFeatures属性和serializeFeatures属性

通过parseFeatures属性和serializeFeatures属性可以配置解析和序列化时的特性

具体可参考阿里巴巴fastjson的文档

示例:

public class User {private String name;private int age;@JSONField(parseFeatures = Feature.AllowSingleQuotes)private String message;
}

在上面的例子中,使用@JSONField注解指定了message属性在解析时允许使用单引号

@JsonProperty

@JsonProperty注解是Jackson框架中的注解,用法类似于@JSONField,也是指定JSON字符串中的属性名和Java对象中的属性名之间的映射关系

1. value

value属性用于指定序列化后的属性名称

如果未提供value属性,则属性名称默认与Java属性名称相同

示例:

public class Person {@JsonProperty("name")private String fullName;}

在上面的例子中,将Java对象中fullName属性序列化为JSON对象中的"name"属性

2. defaultValue

defaultValue属性用于指定当Java对象属性值为null时,序列化为JSON时使用的默认值

该属性仅适用于对象属性而不适用于基本类型属性

示例:

public class Person {@JsonProperty(defaultValue = "John")private String firstName;
}

在上面的例子中,将未设置firstName的Person对象序列化为含有默认值"John"的JSON属性

3. access

access属性用于指定Java属性的访问级别

默认访问级别为PUBLIC,也可以设为READ_ONLY或WRITE_ONLY

示例:

public class Person {@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)private String password;
}

在上面的例子中,将Java对象中的password属性序列化为JSON时忽略掉

4. required

required属性指定此属性是否为必须字段

如果为true,则当将JSON转换回Java对象时,如果该属性不存在,则将引发异常

示例:

public class Person {@JsonProperty(required = true)private String name;
}

在上面的例子中,将Java对象中的name属性序列化为确保其在JSON对象中存在

5. defaultValue

defaultValue属性用于指定Java属性的默认值

在将JSON转换回Java对象时如果该属性不存在或为null,则使用默认值

示例:

public class Person {@JsonProperty(defaultValue = "30")private int age;
}

在上面的例子中,将Java对象中的age属性序列化为JSON时,如果该属性不存在,则使用默认值30

6. index

index属性用于指定序列化的属性在JSON对象中的位置,数值越小,位置越靠前

示例:

public class Person {@JsonProperty(index = 1)private String firstName;@JsonProperty(index = 0)private String lastName;
}


在上面的例子中,将Java对象中的lastName属性序列化为JSON对象中的第一个属性,firstName属性序列化为JSON对象中的第二个属性

7. accessMode

accessMode属性用于指定序列化时使用的访问模式

如果未指定,则默认为PROPETY模式,即访问getter方法获取属性值。另一个可用的模式是FIELD,即直接访问Java属性

示例:

public class Person {private String firstName;@JsonProperty(access = JsonProperty.Access.READ_ONLY, accessMode = JsonProperty.AccessMode.FIELD)private String lastName;
}

在上面的例子中,将Java对象中lastName属性序列化为JSON属性,直接访问Java属性值。

8. ignore

ignore属性用于指定是否忽略该属性

如果为true,则在序列化和反序列化时忽略该属性

示例:

public class Person {private String firstName;@JsonProperty(ignore = true)private String lastName;
}

在上面的例子中,将Java对象中的lastName属性忽略掉,不进行序列化和反序列化

优劣对比

1.@JSONField注解的使用方式更加简单,注解默认的值与属性名相同,而@JsonProperty需要手动指定属性名


2.@JSONField注解支持更多的属性映射选项,例如序列化时的日期格式,空值的处理方式等


3.@JSONField注解的性能较快,因为fastjson本身就是一款高性能的JSON处理库


4.在使用Jackson框架时,只能使用@JsonProperty注解,无法使用@JSONField注解


http://www.ppmy.cn/news/41067.html

相关文章

体验了一把ChatGPT4

不得不说ChatGPT对我的学习效率有极大的提升,它就像一位老师,不管有什么问题,都可以得到很好的答案。但是前段时间gpt3.5账号被封了,最近搞了个gpt4。市面上目前好像没啥可以白嫖的账号,基本都是免费使用几次&#xff…

Oracle之PL/SQL流程控制练习题(二)

1、编写一个程序块,从emp表中显示名为“SMITH”的雇员的薪水和职位2、编写一个程序块,接受用户输入一个部门号,从dept表中显示该部门的名称与所在位置3、编写一个程序块,利用%type属性,接受一个雇员号,从em…

二叉查找树

目录 一、二叉查找树概念 二、结点内部类代码实现: 三、二叉查找树的插入原理​编辑 四、遍历的方式(中序遍历): 五、二叉查找树实现指定值删除对应的结点 六、main方法测试 一、二叉查找树概念 二、结点内部类代码实现&…

Hudi集成Flink-写入方式

文章目录一、CDC 入湖1.1、[开启binlog](https://blog.csdn.net/wuxintdrh/article/details/130142601)1.2、创建测试表1.2.1、创建mysql表1.2.2、将 binlog 日志 写入 kafka1、使用 mysql-cdc 监听 binlog2、kafka 作为 sink表3、写入sink 表1.2.3、将 kakfa 数据写入hudi二、…

数据结构与算法基础(王卓)(24)附:邻接表的广度优先遍历算法BFS(学习过程记录)

邻接表的广度优先遍历算法BFS 第一版&#xff1a; void BFS(ALG G, int v) {cout << G.vex[v].data;visited[v] 1;SqQueue Q;InitQueue(Q);auto iG.vex[v].firstarc;while(!QueneEmpty(Q)){ if(visited[i->adjvex]0)EnQueue(Q, i->adjvex);i i->nextarc;BFS…

基于html+css的自适应展示3

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

【ROS2指南-7】理解ROS2的Action

目标&#xff1a; 理解并学习ROS 2 中的Action通信方式。 教程级别&#xff1a;初学者 时间&#xff1a; 15分钟 内容 背景 先决条件 任务 1 设置 2 使用动作 3 ros2节点信息 4 ros2 动作列表 5 ros2 动作信息 6 ros2界面展示 7 ros2 动作 send_goal 概括 下一步 …

2023年自治区职业院校技能大赛暨全国职业院校技能大赛新疆选拔赛任务书

2023年自治区职业院校技能大赛暨全国职业院校技能大赛新疆选拔赛任务书2023年自治区职业院校技能大赛暨全国职业院校技能大赛新疆选拔赛任务书A模块基础设施设置/安全加固&#xff08;200分&#xff09;A-1&#xff1a;登录安全加固&#xff08;Windows, Linux&#xff09;A-2&…