fastjson2 简单使用

news2024/10/5 21:56:12

参考

https://alibaba.github.io/fastjson2/
https://alibaba.github.io/fastjson2/annotations_cn.html
https://alibaba.github.io/fastjson2/features_cn

基本操作

json 字符串转为 jsonObject:

String json = "{\"name\":\"tom\",\"age\":18}";
JSONObject data = JSON.parseObject(json);

json 字符串转为 jsonArray:

String json = "[{\"name\":\"Alice\",\"age\":25,\"city\":\"Exampleville\"},{\"name\":\"Bob\",\"age\":30," +
        "\"city\":\"Sampleburg\"},{\"name\":\"Charlie\",\"age\":28,\"city\":\"Testington\"}]";
final JSONArray jsonArray = JSON.parseArray(json);

json 字符串转为 java 对象:

String json = "{\"name\":\"tom\",\"age\":18}";
User user = JSON.parseObject(json, User.class);

java 对象转为 json 字符串:

final User user = new User();
user.setName("tom");
user.setAge(18);
final String jsonString = JSON.toJSONString(user);

操作 json:

String json = "{\"name\":\"JohnDoe\",\"age\":30,\"city\":\"NewYork\",\"isStudent\":false,\"grades\":[85,90," +
        "78,92],\"address\":{\"street\":\"123MainSt\",\"zipCode\":\"10001\"},\"contact\":{\"email\":\"john" +
        ".doe@example.com\",\"phoneNumbers\":[\"555-1234\",\"555-5678\"]},\"balance\":1200.75}";
final JSONObject jsonObject = JSON.parseObject(json);
final String name = jsonObject.getString("name");
final Integer age = jsonObject.getInteger("age");
final JSONArray grades = jsonObject.getJSONArray("grades");
final JSONObject address = jsonObject.getJSONObject("address");
final String street = address.getString("street");
final Double balance = jsonObject.getDouble("balance");

fastjson2 中提供了 json 中对象和数组的对应表示,对象使用 JSONObject 表示,列表使用 JSONArray 表示,JSONObject、JSONArray 也都提供了相应的操作方法来实现获取值、添加值、更新值、删除值等操作(方法都很通俗易懂,get 开头就是获取值,set 开头的方法就是更新值,方法名和 remove 类似的就是删除操作,非常简单)。

高级操作

枚举类序列化时指定序列化使用的字段

第一种实现方法比较复杂,是使用自定义序列化器实现:

@Getter
public enum Season {
    SPRING("春天", "万物复苏"),
    SUMMER("夏天", "热"),
    AUTUMN("秋天", "秋高气爽"),
    WINTER("冬季", "冷");

    private final String description;

    private final String features;

    Season(String description, String features) {
        this.description = description;
        this.features = features;
    }

}
@Data
public class Student {
    public String name;
    public Integer age;
    public Season favoriteSeason;
}
// enum 默认序列化成 json
final Student student = new Student();
student.setAge(18);
student.setName("tom");
student.setFavoriteSeason(Season.SUMMER);
System.out.println(JSON.toJSONString(student));

// 使用序列化器指定枚举类序列化时使用的字段
final ObjectWriter<Season> seasonWriter = (jsonWriter, fieldValue, fieldName, type, l) -> {
    if (fieldValue instanceof Season) {
        jsonWriter.writeString(((Season) fieldValue).getDescription());
    } else {
        jsonWriter.writeAny(fieldValue);
    }
};

final ObjectWriterProvider objectWriterProvider = new ObjectWriterProvider();
objectWriterProvider.register(Season.class, seasonWriter);
final JSONWriter.Context writeContext = JSONFactory.createWriteContext(objectWriterProvider);
final String jsonString = JSON.toJSONString(student, writeContext);
System.out.println(jsonString);

image.png
从结果中可以看到,enum 默认序列化时使用的是枚举常量,我们使用自定义序列化器指定序列化 Season 枚举类时使用它的 description 字段作为字段值。

还有更简单的方法,就是使用 @JSONField(value = true)注解设置枚举类要序列化时使用的字段,下面的 jsonField 注解的使用这个章节中讲了。

jsonField 注解的使用

@Data
public class Student {
    @JSONField(ordinal = 2)
    private Integer age;
    private Season favoriteSeason;
    @JSONField(ordinal = 1)
    private String name;
    @JSONField(format = "yyyyMMdd")
    private Date birthday;
    @JSONField(serialize = false)
    private String address;
    @JSONField(deserialize = false)
    private String favoriteFood;
    @JSONField(name = "GENDER")
    private Gender gender;
}

@JSONField(ordinal = 2)注解设置了字段在序列化为 json 后的排列顺序,越小排在越前。
@JSONField(format = "yyyyMMdd")注解设置了在序列化 Date 类型的 birthday 字段时使用的日期格式。
@JSONField(serialize = false)注解设置了 address 字段不会被序列化,也就是序列化的结果中不会包含 address 字段。
@JSONField(deserialize = false)注解设置了将 json 序列化成 student 对象时不会序列化 favoriteFood 字段,也就是 favoriteFood 字段会为 null
@JSONField(name = "GENDER")注解设置了 gender 字段序列化成 json 时的字段名为 GENDER。

如果类的字段是 public 并且有 get 和 set 方法,@JSONField(deserialize = false) 会失效。bean 类都尽量标准一点,属性都设置为 private,提供 get 和 set 方法,这样会减少异常的发生。

@Getter
public enum Season {
    SPRING("春天", "万物复苏"),
    SUMMER("夏天", "热"),
    AUTUMN("秋天", "秋高气爽"),
    WINTER("冬季", "冷");

    private final String description;

    @JSONField(value = true)
    private final String features;

    Season(String description, String features) {
        this.description = description;
        this.features = features;
    }
}

@JSONField(value = true)设置了 Season 枚举类序列化成 json 时会使用 features 字段做为其值,而不是默认使用的枚举常量。

jsonPath 从 json 字符串中读取字段值

String str = "{\"address\":\"翻斗大街翻斗花园二号楼1001室\",\"favoriteFood\":\"炸小肉丸\",\"name\":\"图图\",\"age\":3,\"id\":10}";

JSONPath path = JSONPath.of("$.id");
JSONReader parser = JSONReader.of(str);
Integer result = (Integer) path.extract(parser);

System.out.println(result);

上面的代码实现了从 json 字符串中读取 id 字段的值。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML5+CSS3+移动web——CSS基础

系列文章目录 HTML5CSS3移动web——HTML 基础-CSDN博客https://blog.csdn.net/ymxk2876721452/article/details/136070953?spm1001.2014.3001.5501HTML5CSS3移动web——列表、表格、表单-CSDN博客https://blog.csdn.net/ymxk2876721452/article/details/136221443?spm1001.2…

SOC的多核启动流程详解

目录 1、基础概念2、启动流程3、ATF(TF-A)代码的剖析5、软件如何判断当前是cold reset/warm reset/primary boot/senondary boot5.1 cold reset和warm reset5.2 primary boot和secondary boot 6、mailbox的介绍6.1 mailbox是什么6.2 mailbox的作用6.3 mailbox的示例 7、具体场景…

案例分析01-题型分析与历年案例题真题考点汇总(2024年软考高级系统架构设计师冲刺知识点总结)

1、历年真题案例分析题考点汇总 1.1 2018年~2023年 1.2 2012年~2017年 2、考试安排 案例分析题的考试安排在下午&#xff0c;时间为1.5小时&#xff0c;相对来说比较轻松。 上午&#xff1a;09:00-11:30,150分钟&#xff0c;2.5小时 综合知识题&#xff0c;全选择题&#xff…

Ps:画笔工具

画笔工具 Brush Tool是 Photoshop 中最常用的工具&#xff0c;可广泛地用于绘画与修饰工作之中。 快捷键&#xff1a;B ◆ ◆ ◆ 常用操作方法与技巧 1、熟练掌握画笔工具的操作对于使用其他工具也非常有益&#xff0c;因为 Photoshop 中许多与笔刷相关的工具有类似的选项和操…

职场成功的关键:积极主动,勇于担当

在职场中&#xff0c;每个人都渴望成功。然而&#xff0c;成功并非一蹴而就&#xff0c;而是需要我们在日常工作中不断积累、锻炼和提升。本文将为您揭示职场成功的关键因素&#xff0c;帮助您在职场道路上越走越远。 一、积极主动&#xff0c;主动承担责任 在职场中&#xff0…

基于多源信息融合的巡飞弹对地目标识别与毁伤评估

源自&#xff1a;系统仿真学报 作者&#xff1a;徐艺博 于清华 王炎娟 郭策 冯世如 卢惠民 “人工智能技术与咨询” 发布 摘 要 面向利用多枚巡飞弹对地面高防御移动目标进行打击的任务场景&#xff0c;提出一种基于多源信息融合的巡飞弹对地移动目标识别与毁伤评估方法…

【C++从练气到飞升】02---初识类与对象

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 ⛳️推荐 一、面向过程和面向对象初步认识 二、类的引用 1. C语言版 2. C版 三、类的定义 类的两种定义方式&#xff…

趣学前端 | JavaScript标准库

背景 最近睡前习惯翻会书&#xff0c;重温了《JavaScript权威指南》这本书。这本书&#xff0c;文字小&#xff0c;内容多。两年了&#xff0c;我才翻到第十章。因为书太厚&#xff0c;平时都充当电脑支架。 JavaScript标准库 今天阅读的章节是JavaScript标准库&#xff0c;…

Python可视化 --条形图(bar)

1&#xff0e;matplotlib模块 应用matplotlib模块绘制条形图&#xff0c;需要调用bar函数&#xff0c;关于该函数的语法和参数含义如下&#xff1a; bar(x, height, width0.8, bottomNone, colorNone, edgecolorNone,linewidthNone, tick_labelNone, xerrNone, yerrNone,labe…

C++11——智能指针

本文将解决一下几个问题 1.什么是智能指针 2.为什么需要之智能指针 3.智能指针的使用场景 智能指针 RAII&#xff1a;是一种利用对象声明周期来控制的程序资源&#xff08;如内存、文件句柄、网络连接、互斥量等&#xff09;的技术 在对象构造的时候获取资源&#xff0c;接…

chatGPT发不出消息,一直转圈,最简单的解决办法。

chatGPT发不出消息&#xff0c;一直转圈&#xff0c;最简单的解决办法。-CSDN博客文章浏览阅读358次&#xff0c;点赞12次&#xff0c;收藏3次。解决chatgpt发消息一直转圈现象。https://blog.csdn.net/z3256707200/article/details/136607923?ops_request_misc&request_i…

谷歌BigQuery推出新玩意儿,向量搜索登场啦!

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

高分1、2号卫星原始遥感影像数据

高分一号 高分一号卫高分一号卫星是中国高分辨率对地观测系统的首发星&#xff0c;突破了高空间分辨率、多光谱与宽覆盖相结合的光学遥感等关键技术&#xff0c;设计寿命5至8年。 高分辨率对地观测系统工程是《国家中长期科学和技术发展规划纲要(2006&#xff5e;2020年)》确定…

Mamba.py: 状态空间模型的并行扫描

文章目录 Mamba.py&#xff1a;扫描和并行扫描什么是扫描什么是并行扫描累加计算的例子矩阵求和简化矩阵求和python实现累加求和的并行 Blelloch 算法Up-sweepDown-sweep selective_scan Mamba.py&#xff1a;扫描和并行扫描 mamba.py/docs/pscan.ipynb at main alxndrTL/mam…

Kafka可用与可靠机制

文章目录 kafka的副本机制ACKSIn-Sync Replicas&#xff08;ISR&#xff09;Unclean leader electionmin.insync.replicas acks1的情况acks-1的情况acks-1和min.insync.replicas2的情况 同步机制1.follower不对外提供服务的原因2.幂等性的实现 kafka的副本机制 假如3分区&…

Linux/Windows下部署OpenCV环境(Java/SpringBoot/IDEA)

环境 本文基于Linux&#xff08;CentOS 7&#xff09;、SpringBoot部署运行OpenCV 4.5.5&#xff0c;并顺带记录Windows/IDEA下如何调试SpringBoot调用OpenCV项目。 Windows下调试 首先我们编写代码&#xff0c;并在Windows/IDEA下调试通过。 下载Windows版安装包&#xff0…

OD_2024_C卷_200分_6、六_连续出牌数量【JAVA】【回溯算法】

题目描述 package odjava;import java.util.Arrays; import java.util.Scanner;public class 六_连续出牌数量 {// 定义扑克牌类static class Card {int num; // 牌号char color; // 花色public Card(int num, String color) {this.num num;this.color color.charAt(0); // 取…

网络套接字1

网络套接字1 &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容讲解了udp的Linux环境下的使用&#xff0c…

JVM3_数据库连接池虚引用ConnectionFinalizerPhantomReference引起的FullGC压力问题排查

背景 XOP服务运行期间&#xff0c;查看Grafana面板&#xff0c;发现堆内存周期性堆积&#xff0c;观察FullGC的时间&#xff0c;xxx&#xff0c;需要调查下原因 目录 垃圾收集器概述 常见的垃圾收集器分区收集策略为什么CMS没成为默认收集器 查看JVM运行时环境分析快照 Pha…

msfconsole中db_namp的使用方法以及如何让msf连接数据库

一、db_nmap使用方法 1.打开数据库 1.1查看数据库postgresql连接状态 systemctl status postgresql查看数据库postgresql连接状态、 1.2启动postgresql systemctl start postgresql启动postgresql 1.3初始化 msfdb init初始化 2.C段扫描(db_nmap的使用) 2.1 db_nmap -sP 192…