Fastjson 常用语法

一.Json数据格式回顾

1.1 什么是json

JSON:(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。目前,Json处于数据交换语言的王者地位.

1.2 Json数组格式

Json的数据本身是数组,中括号包裹,数组的元素之间逗号分开.数组元素的数据类型没有限制.

var jsonArray = ["元素1","元素2","元素3"]; //定义数组格式json
console.log(jsonArray[0]); //访问json数组的元素
for(var i = 0 ; i < jsonArray.length ; i++){console.log(jsonArray[i]); //遍历数组,访问每个元素
}

1.3 Json对象格式

Json的数据本身是对象,大括号包裹.对象采用键值对形式存储,键固定为字符串类型,值是任意类型的数据.键和值使用冒号分开.

var jsonObject = {"k1":"v1","k2":"v2","k3":"v3"}; //定义对象格式json
console.log(jsonObject.k1); //取出键k1对应的值

1.4 数组对象相互嵌套格式

  1. 数组中的元素是对象
var jsonArray = [{"k1":"v1"},{"k2":"v2"}
]; // 定义数组格式json,数组元素是对象
console.log(jsonArray[0].k1); //访问数组0索引的元素,该元素的键k1对应的值
  1. 对象中的值是数组
var jsonObject = {"k1":["元素1","元素2"],"k2":["元素1","元素2"]
}; // 定义对象格式json,键是字符串类型,值是数组
console.log(jsonObject.k1[0]); //访问对象的键是k1,对于的值为数组,数组的0索引元素
  1. 你中有我,我中有你
var json = {"k1":["元素1",{"key1":"value1"},{"key2":"value2"}  ],"k2":[{"key1":"value1"}]
}; //定义对象格式json,键是字符串,值是数组,数组的元素是对象
console.log(json.k1[1].key1); //访问json对象的键k1,对应的是数组,访问数组的1索引,数组的1索引上的元素是对象,访问key1键对应的值

二.Fastjson 简介

fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

Fastjson 源码地址:https://github.com/alibaba/fastjson

Fastjson 中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN

三.Fastjson的优点

3.1 速度快

  • fastjson相对其他JSON库的特点是快,从2011年fastjson发布1.1.x版本之后,其性能从未被其他Java实现的JSON库超越。

3.2 使用广泛

  • fastjson在阿里巴巴大规模使用,在数万台服务器上部署,fastjson在业界被广泛接受。在2012年被开源中国评选为最受欢迎的国产开源软件之一。

3.3 测试完备

  • fastjson有非常多的testcase,在1.2.11版本中,testcase超过3321个。每次发布都会进行回归测试,保证质量稳定。

3.4 使用简单

  • fastjson的API十分简洁。

3.5 功能完备

  • 支持泛型,支持流处理超大文本,支持枚举,支持序列化和反序列化扩展。

四.下载和使用

4.1 配置maven依赖

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.79</version>
</dependency>

五.FastJson序列化API

序列化 : 是指将Java对象转成json格式字符串的过程.JavaBean对象,List集合对象,Map集合,为应用最广泛的.

  • JSON.toJSONString

    • 序列化Java对象(定义以下 Person JavaBean)
@Test
public void objectToJson() {Student student = new Student();student.setId(1);student.setName("张三");student.setAge(20);student.setAddress("北京市");student.setEmail("zs@sina.com");String jsonString = JSON.toJSONString(student);System.out.println(jsonString);
}

输出结果为:

{"address": "北京市","age": 20,"email": "zs@sina.com","id": 1,"name": "张三"
}
  • JSON.toJSONString

    • 序列化List集合
@Test
public void listToJson(){Student student = new Student();student.setId(1);student.setName("张三");student.setAge(20);student.setAddress("北京市");student.setEmail("zs@sina.com");Student student2 = new Student();student2.setId(2);student2.setName("张三2");student2.setAge(22);student2.setAddress("北京市2");student2.setEmail("zs2@sina.com");List<Student> list = new ArrayList<Student>();list.add(student);list.add(student2);String jsonString = JSON.toJSONString(list);System.out.println(jsonString);
}

输出结果为:

[{"address": "北京市","age": 20,"email": "zs@sina.com","id": 1,"name": "张三"},{"address": "北京市2","age": 22,"email": "zs2@sina.com","id": 2,"name": "张三2"}
]
  • JSON.toJSONString

    • 序列化Map集合
@Test
void testToJSONString() {// 创建集合List<Person> personList = new ArrayList<>();// 添加数据Collections.addAll(personList,new Person(15, "张", "张三", new Date()),new Person(21, "李", "李四", new Date()));// 打印数据System.out.println(JSON.toJSONString(personList));
}

输出结果为:

{"s1": {"address": "北京市","age": 20,"email": "zs@sina.com","id": 1,"name": "张三"},"s2": {"address": "北京市2","age": 22,"email": "zs2@sina.com","id": 2,"name": "张三2"}
}

六.FashJson反序列化API

我们可以使用 JSON.parseObject() 将 JSON 字符串转换为 Java 对象,代码如下:

  • JSON.parseObject

    • 反序列化Java对象
@Test
public void jsonToObject() {String jsonString = "{\"address\":\"北京市\",\"age\":20,\"email\":\"zs@sina.com\",\"id\":1,\"name\":\"张三\"}";Student student = JSON.parseObject(jsonString, Student.class);System.out.println(student);
}

输出结果为:

在这里插入图片描述

  • JSON.parseArray

    • 反序列化List集合
@Test
public void jsonToList() {String jsonString = "[{\"address\":\"北京市\",\"age\":20,\"email\":\"zs@sina.com\",\"id\":1,\"name\":\"张三\"},{\"address\":\"北京市2\",\"age\":22,\"email\":\"zs2@sina.com\",\"id\":2,\"name\":\"张三2\"}]";List<Student> list = JSON.parseArray(jsonString, Student.class);for (int i = 0; i < list.size(); i++) {Student student = list.get(i);System.out.println(student);}
}

输出结果为:

在这里插入图片描述

  • JSON.parseObject

    • 反序列化Map集合
@Test
public void jsonToMap() {String jsonString = "{\"s1\":{\"address\":\"北京市\",\"age\":20,\"email\":\"zs@sina.com\",\"id\":1,\"name\":\"张三\"},\"s2\":{\"address\":\"北京市2\",\"age\":22,\"email\":\"zs2@sina.com\",\"id\":2,\"name\":\"张三2\"}}";Map<String, Student> parse = JSON.parseObject(jsonString, new TypeReference<Map<String, Student>>() {});for (String s : parse.keySet()) {System.out.println(s + ":::" + parse.get(s));}
}

输出结果为:

在这里插入图片描述

七.@JSonField注解

该注解作用于方法上,字段上参数上.可在序列化和反序列化时进行特性功能定制.

  • 注解属性 : name 序列化后的名字
  • 注解属性 : ordinal序列化后的顺序
  • 注解属性 : format 序列化后的格式
  • 注解属性 : serialize 是否序列化该字段
  • 注解属性 : deserialize 是否反序列化该字段
  • 注解属性 : serialzeFeatures 序列化时的特性定义
public @interface JSONField {// 配置序列化和反序列化的顺序,1.1.42版本之后才支持int ordinal() default 0;// 指定字段的名称String name() default "";// 指定字段的格式,对日期格式有用String format() default "";// 是否序列化boolean serialize() default true;// 是否反序列化boolean deserialize() default true;
}
  • 字段上:可以在字段上使用 @JSONField 注解来指定字段的序列化和反序列化的行为,例如:
public class User {@JSONField(name = "id")private Long userId;@JSONField(format = "yyyy-MM-dd")private Date birthDate;// getters and setters
}
  • 方法上:可以在 getter 或者 setter 方法上使用 @JSONField 注解来控制对应字段的序列化和反序列化行为,例如:
public class User {private Long userId;private String username;@JSONField(name = "id")public Long getUserId() {return userId;}@JSONField(name = "id")public void setUserId(Long userId) {this.userId = userId;}// getters and setters for other fields
}

八.@JSonType注解

该注解作用于类上,对该类的字段进行序列化和反序列化时的特性功能定制.

  • 注解属性 : includes 要被序列化的字段.
  • 注解属性 : orders 序列化后的顺序.
  • 注解属性 : serialzeFeatures 序列化时的特性定义.

九.SerializerFeature枚举

SerializerFeature 是 Fastjson 序列化库提供的一组枚举常量,用于配置 JSON 序列化过程中的不同特性和选项。通过在序列化时传递相应的 SerializerFeature 常量,可以根据需求自定义序列化行为。

  • 枚举常量 WriteMapNullValue 序列化为null的字段
@Test
public void testSerializerFeature() {Student student = new Student();student.setId(1);student.setName("张三");student.setAge(20);//student.setAddress("北京市");student.setEmail("zs@sina.com");String jsonString = JSON.toJSONString(student, SerializerFeature.WriteMapNullValue);System.out.println(jsonString);
}

输出结果为:

在这里插入图片描述

  • 枚举常量 WriteNullStringAsEmpty 字段为null,序列化为""
@Test
public void testSerializerFeature() {Student student = new Student();student.setId(1);student.setName("张三");student.setAge(20);//student.setAddress("北京市");student.setEmail("zs@sina.com");String jsonString = JSON.toJSONString(student, SerializerFeature.WriteNullStringAsEmpty);System.out.println(jsonString);
}

输出结果为:

在这里插入图片描述

  • 枚举常量 WriteNullNumberAsZero 字段为null,序列化为0
@Test
public void testSerializerFeature() {Student student = new Student();student.setId(1);student.setName("张三");//student.setAge(20);student.setAddress("北京市");student.setEmail("zs@sina.com");String jsonString = JSON.toJSONString(student, SerializerFeature.WriteNullNumberAsZero);System.out.println(jsonString);
}

输出结果为:

在这里插入图片描述

  • 枚举常量 PrettyFormat格式化输出
@Test
public void testSerializerFeature2() {Person person = new Person();//person.setFlag(true);person.setDate(new Date());String jsonString = JSON.toJSONString(person, SerializerFeature.WriteNullBooleanAsFalse,SerializerFeature.WriteDateUseDateFormat, SerializerFeature.PrettyFormat);System.out.println(jsonString);
}

输出结果为:

在这里插入图片描述

  • 枚举常量 WriteNullBooleanAsFalse 字段值为null 输出false

  • 枚举常量 WriteDateUseDateFormat 格式化日期格式

十.创建 JSON 对象

创建 JSON 对象非常简单,只需使用 JSONObject(fastJson提供的json对象) 和 JSONArray(fastJson提供json数组对象) 对象即可。

我们可以把JSONObject 当成一个 Map<String,Object> 来看,只是 JSONObject 提供了更为丰富便捷的方法,方便我们对于对象属性的操作。我们看一下源码:

在这里插入图片描述

同样我们可以把 JSONArray 当做一个List<Object>,可以把 JSONArray 看成 JSONObject 对象的一个集合,查看源码:

在这里插入图片描述

此外,由于JSONObjectJSONArray 继承了 JSON,所以说也可以直接使用两者对 JSON 格式字符串与 JSON 对象及 javaBean 之间做转换。

@Test
void testJSONArrayAndJSONObject(){JSONArray jsonArray = new JSONArray();for (int i = 0; i < 2; i++) {JSONObject jsonObject = new JSONObject();jsonObject.put("age",21);jsonObject.put("name","jeck"+i);jsonObject.put("dateOfBirth","2023-12-22 12:12:12");jsonArray.add(jsonObject);}System.out.println(jsonArray.toJSONString());
}

输出结果为:

[{"name": "jeck0","dateOfBirth": "2023-12-22 12:12:12","age": 21},{"name": "jeck1","dateOfBirth": "2023-12-22 12:12:12","age": 21}
]

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

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

相关文章

hbase用shell命令新建表报错ERROR: KeeperErrorCode = NoNode for /hbase/master

或者HMster开启后几秒消失问题解决 报错如图&#xff1a; 首先jps命令查看当前运行的内容有没有HMaster,如果没有&#xff0c;开启一下hbase,稍微等一会儿&#xff0c;再看一下HMaster,如果仍和下图一样没有&#xff0c;就基本找到问题了 本人问题原因&#xff1a;hbase-site…

网络基础【网线的制作、OSI七层模型、集线器、交换机介绍、路由器的配置】

目录 一.网线的制作 1.1.网线的标准 1.2.水晶头的做法 二.OSI七层模型、集线器、交换机介绍 集线器&#xff08;Hub&#xff09;&#xff1a; 交换机&#xff08;Switch&#xff09;&#xff1a; 三.路由器的配置 3.1.使用 3.2.常用的功能介绍 1、如何管理路由器 2、家…

WebGL在教育和培训的应用

WebGL在教育和培训领域具有广泛的应用&#xff0c;其强大的图形渲染能力和跨平台性使得它成为创建交互式、视觉化的数字内容的理想选择。以下是一些WebGL在教育和培训上的应用示例&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司…

算法训练营Day22

#Java #回溯 开源学习资料 Feeling and experiences&#xff1a; 进入到回溯算法的章节&#xff0c;在代码随想录中有详细的回溯算法理论基础 在此总结归纳&#xff1a; 刚开始接触到回溯时&#xff0c;看到了终止条件&#xff0c;递归调用.....等&#xff0c;发现了其与递…

【C语言】动态内存管理基础知识——动态通讯录,如何实现通讯录容量的动态化

引言 动态内存管理的函数有&#xff1a;malloc,calloc,ralloc,free,本文讲解动态内存函数和使用&#xff0c;如何进行动态内存管理,实现通讯录联系人容量的动态化&#xff0c;对常见动态内存错误进行总结。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》…

Vue.js 教程

Vue.js&#xff08;读音 /vjuː/, 类似于 view&#xff09; 是一套构建用户界面的渐进式框架。 Vue 只关注视图层&#xff0c; 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 阅读本教程前&#xff0c;您需要了解的…

FPGA编程入门——基于Quartus件完成一个1位全加器的设计

基于Quartus件完成一个1位全加器的设计&#xff0c;分别采用&#xff1a;1&#xff09;原理图输入 以及 2&#xff09;Verilog编程 这两种设计方法。开发板基于Intel DE2-115。 在此基础上&#xff0c;用原理图以及Verilog 编程两种方式&#xff0c;完成4位全加器的设计&#x…

竞赛保研 基于CNN实现谣言检测 - python 深度学习 机器学习

文章目录 1 前言1.1 背景 2 数据集3 实现过程4 CNN网络实现5 模型训练部分6 模型评估7 预测结果8 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于CNN实现谣言检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&am…

SQL---Zeppeline前驱记录与后驱记录查询

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…

Latex生成的PDF中加入书签/Navigation/导航

本文参考&#xff1a;【Latex学习】在生成pdf中加入书签/目录/提纲_latex 书签-CSDN博客 &#xff08;这篇文章写的真的太棒了&#xff01;非常推荐&#xff09; 题外话&#xff0c;我的碎碎念&#xff0c;这也是我如何提高搜索能力的办法&#xff1a;想在Latex生成的PDF中加入…

Java代码审计Mybatis注入文件上传下载读取(非常详细!!)

目录 0x00 前言 0x01 Mybatis注入审计 - 若依&#xff08;Ruoyi&#xff09;后台管理系统 4.6.0 1、项目介绍与部署 - Ruoyi 2、若依 Ruoyi - Mybatis注入 - 代码审计 3、代审常搜词 - Java SQL 注入 0x02 文件上传漏洞审计 - Inxedu && Tmall 1、项目介绍与部署…

大规模采用奇点临近?Web3应用爆发离不开这个“支撑”赛道

作者&#xff5c;Jason Jiang 数据是当今世界最具价值的资源&#xff0c;也是数字掘金的必争之地。尽管Web3迄今仍有诸多争议&#xff0c;但随着铭文、Gamefi、DeFi等链上生态的多样化发展&#xff0c;我们正身处Web3应用爆发的洪流之中&#xff0c;区块链数据赛道也因此备受关…