Java - @JSONField和@JsonProperty注解

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

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

一、@JSONField

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

1、name属性

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

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;public class Test1Controller {public static void main(String[] args) {String str = "{\"ID\":11,\"Name\":\"张三\"}";User user = JSON.parseObject(str, User.class);System.out.println("User对象:" + user.toString());}
}@Data
class User {@JSONField(name = "ID")private Integer userId;@JSONField(name = "Name")private String userName;@Overridepublic String toString() {return "User{" +"userId=" + userId +", userName='" + userName + '\'' +'}';}
}

2、format属性

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

public class User {@JSONField(format = "yyyy-MM-dd")private Date birthday;@JSONField(format = "#,###.00")private double salary;
}
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;
}

二、@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 User {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 User{private String firstName;@JsonProperty(ignore = true)private String lastName;
}

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

三、@JSONField和@JsonProperty区别

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

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

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

4、在使用Jackson框架时,只能使用@JsonProperty注解,无法使用@JSONField注解!!!不然会导致解析失败,无法取到值,如下

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;public class Test1Controller {public static void main(String[] args) {String str = "{\"ID\":11,\"Name\":\"张三\"}";User user = JSON.parseObject(str, User.class);System.out.println("User对象:" + user.toString());}
}@Data
class User {@JsonProperty("ID")private Integer userId;@JsonProperty("Name")private String userName;@Overridepublic String toString() {return "User{" +"userId=" + userId +", userName='" + userName + '\'' +'}';}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/479703.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

缓存驱动联邦学习架构赋能个性化边缘智能 | TMC 2024

缓存驱动联邦学习架构赋能个性化边缘智能 | TMC 2024 伴随着移动设备的普及与终端数据的爆炸式增长,边缘智能(Edge Intelligence, EI)逐渐成为研究领域的前沿。在这一浪潮中,联邦学习(Federated Learning, FL&#xf…

【Algorithms 4】算法(第4版)学习笔记 09 - 3.2 二叉查找树

文章目录 前言参考目录学习笔记1:二叉树与二叉搜索树定义1.1:二叉树定义1.2:二叉搜索树定义1.3:Java定义1.4:BST基本实现1.5:BST demo 演示1.5.1:节点搜索成功命中演示1.5.2:节点搜索…

Waymo数据集下载与使用

在撰写论文时,接触到一个自动驾驶数据集Waymo Dataset 论文链接为:https://arxiv.org/abs/1912.04838v7 项目链接为:https://github.com/waymo-research/waymo-open-dataset 数据集链接为:https://waymo.com/open waymo提供了两种…

忘记管理员密码

1、在/home/jenkins/config.xml中删除&#xff1a; <useSecurity>true</useSecurity><authorizationStrategy class"hudson.security.FullControlOnceLoggedInAuthorizationStrategy"><denyAnonymousReadAccess>false</denyAnonymousRea…

【鸿蒙系统学习笔记】状态管理

一、介绍 资料来自官网&#xff1a;文档中心 在声明式UI编程框架中&#xff0c;UI是程序状态的运行结果&#xff0c;用户构建了一个UI模型&#xff0c;其中应用的运行时的状态是参数。当参数改变时&#xff0c;UI作为返回结果&#xff0c;也将进行对应的改变。这些运行时的状…

全面解读视频生成模型Sora

2024年2月15日&#xff0c;OpenAI在其官网发布了《Video generation models as world simulators》的报告&#xff0c;该报告提出了作为世界模拟器的视频生成模型Sora。 OpenAI对Sora介绍如下&#xff1a; We explore large-scale training of generative models on video dat…

[力扣 Hot100]Day30 两两交换链表中的节点

题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 出处 思路 前两个结点先偷一手用交换val做&#xff0c;从链表第1…

智慧社区管理系统:构建未来的生活模式

在这个信息化、智能化的时代&#xff0c;我们期待的不再是简单的居住空间&#xff0c;而是一个集安全、便捷、舒适、环保于一体的智能化社区。为此&#xff0c;我们推出了全新的智慧社区管理系统&#xff0c;旨在将先进的科技力量引入社区管理&#xff0c;为居民提供更优质的生…

[word] word正反面打印应该怎么设置呢? #知识分享#学习方法#职场发展

word正反面打印应该怎么设置呢&#xff1f; word文档打印时&#xff0c;如果页数比较多&#xff0c;出于格式要求或为了节省纸张&#xff0c;通常需要正反面打印&#xff0c;那怎么操作正反双面打印呢&#xff1f;通常有两种方法打印。 1、选择“打印”对话框底部的“打印”下…

力扣145 二叉树的后序遍历 Java版本

文章目录 题目描述递归解法代码 非递归解法思路代码 题目描述 给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1] 示例 2&#xff1a; 输入&#xff1a;root [] 输出…

性能测试、负载测试、压力测试、稳定性测试简单区分

是一个总称&#xff0c;可细分为性能测试、负载测试、压力测试、稳定性测试。 性能测试 以系统设计初期规划的性能指标为预期目标&#xff0c;对系统不断施加压力&#xff0c;验证系统在资源可接受范围内&#xff0c;是否能达到性能瓶颈。 关键词提取理解 有性能指标&#…

0成本部署github前端项目流程

0成本部署github纯前端项目流程 对业内来说应该是一个比较常规的操作&#xff0c;对于新手来说进行过一次应该就很难忘记了&#xff0c;但很多人仍然是不会的&#xff0c;认为部署项目很难&#xff0c;很专业&#xff0c;其实现在由于这些厂商的努力&#xff0c;大众&#xff…