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
  }
]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

省时攻略:快速获得Creo安装包,释放创意天才!

不要再在网上浪费时间寻找Creo的安装包了&#xff0c;一键下载安装&#xff0c; 你要的一切都可以在这里找到&#xff01;我们深知在海量的信息中寻找合适的软件包并非易事&#xff0c;而且往往还伴随着繁琐的安装过程。然而&#xff0c;现在有了我们&#xff0c;一切变得轻松简…

常见激活函数

激活函数是神经网络中的一种非线性变换&#xff0c;它在神经元的输出上引入了非线性性质&#xff0c;使神经网络能够更好地学习和适应复杂的数据模式。以下是一些常见的激活函数&#xff1a; Sigmoid 函数 Sigmoid 函数将输入映射到&#xff08;0&#xff0c;1&#xff09;之间…

模块与包、反序列化校验源码分析、断言、drf之请求、drf之响应

模块与包 什么是模块&#xff1f; 一个py文件&#xff0c;被别的py文件导入使用&#xff0c;它就是模块 如果py文件&#xff0c;直接右键运行&#xff0c;它叫脚本文件 什么是包&#xff1f; 一个文件夹&#xff0c;下有 __init__.py &#xff0c;和很多py文件&#xff0c;这个…

Ubuntu 常用命令之 scp 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 SCP&#xff08;Secure Copy&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;的文件传输协议&#xff0c;它可以在本地和远程主机之间安全地复制文件。在Ubuntu系统下&#xff0c;我们可以使用scp命令来实现这个功…

tcp 的限制 (TCP_WRAPPERS)

#江南的江 #每日鸡汤&#xff1a;青春是打开了就合不上的书&#xff0c;人生是踏上了就回不了头的路&#xff0c;爱情是扔出了就收不回的赌注。 #初心和目标&#xff1a;拿到高级网络工程师 TCP_WRAPPERs Tcp_wrappers 对于七层模型中是位于第四层的安全工具&#xff0c;他…

零成本搭建一款博客网站(基于Vercel+Hexo完美实现)【保姆级教程】

文章目录 &#x1f438;基于VercelHexo零成本搭建博客网站&#x1f43b;实现思路 &#x1f42e;Hexo的配置与安装&#x1f412;Hexo的美化与使用&#x1f42b;Github的推送与部署&#x1f43c;Vercel部署与网站上线&#x1f41b;总结 &#x1f438;基于VercelHexo零成本搭建博客…

冬至·特辑:Note4---二叉树的链式结构

目录 前言&#x1f9f6; 1. 二叉树链式结构的实现&#x1f427; 1.1 要实现的目标&#x1f3af; 2.二叉树的创建&#x1f339; 2.1代码实现 2.1.1 TreeNode.h 2.1.2 TreeNode.c 3.实现二叉树的遍历&#x1f432; 3.1 思路分析&#x1f424; 3.2 前/中/后序遍历&#…

IDEA 中 Tomcat 日志乱码

1、服务器输出乱码 修改 File -> settings -> Editor -> General ->Console 中&#xff0c;utf-8改为GBK&#xff0c;反之改成utf-8 2、Tomcat Localhost Log 或者 Tomcat Catalina Log乱码 进入Tomcat 中的conf文件中的logging.properties 哪个有问题改哪个&…

1223西站坐标更新

1223 西站坐标更新 1.Update for the station’s location def initial_out_map_indoor_points(self):Load the indoor data and update both the wall_matrix and the ditch_matrix.# Initialize the wall_matrix# List of coordinatescoordinates [(417, 287, 417, 290),(4…

Java--抽象工厂设计模式

抽象工厂设计模式 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 在抽象工厂模式中&#xff0c;接口是负责…

考研往应届考生报名流程?

文章目录&#xff1a; 一&#xff1a;考试时间相关 二&#xff1a;公告查询获取信息 三&#xff1a;提供材料 1.基本要求 2.证件要求 四&#xff1a;相关问题 1.报名流程如何操作 2.考点选择 2.1 应届考生考点选择 2.2 往届考生考点选择 3.预报名时间可能不同 4.档…

Python编程 圣诞树教程 (附代码)专属于程序员的浪漫

文章目录 1.turtle库2.python函数的定义规则3.引入库4.定义画彩灯函数5.定义画圣诞树的函数6.定义树下面小装饰的函数7.定义一个画雪花的函数8.画五角星9.写文字10.全部源代码11.html圣诞树代码实现&#xff08;动态音乐&#xff09; 1.turtle库 turtle库是Python语言中一个很…

Java LocalDateTime转Json报错处理

在项目中LocalDateTime 进行json转换时&#xff0c;抛出序列化异常&#xff0c;查找解决方案&#xff0c;记录下来&#xff0c;方便备查。 报错信息 Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type java.time.LocalDateT…

【小白攻略】php 小数转为百分比,保留两位小数的函数

php 小数转为百分比 首先&#xff0c;最简单直观的方法是利用PHP内置的number_format函数。该函数可以对一个数字进行格式化&#xff0c;并可以设置小数点后的精度。通过将小数乘以100&#xff0c;再用number_format函数将结果格式化为百分比形式&#xff0c;即可达到将小数转为…

基于Java SSM框架实现多人试卷批改考试命题系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现多人试卷批改考试命题系统演示 摘要 多人命题系统是高校为教师、学生试卷的重要组成部分&#xff0c;是实现人才培养目标、培养学生科研能力与创新思维、检验学生综合素质与实践能力的重要手段与综合性实践教学环节。我所在学院多采用半手工管理学生试卷…

什么是动态代理?

目录 一、为什么需要代理&#xff1f; 二、代理长什么样&#xff1f; 三、Java通过什么来保证代理的样子&#xff1f; 四、动态代理实现案例 五、动态代理在SpringBoot中的应用 导入依赖 数据库表设计 OperateLogEntity实体类 OperateLog枚举 RecordLog注解 上下文相…

车云TCP链路偶现链接失联问题排查

一、问题分析 1.1 车云tcp长连接分析排查 在15:37:32.039上线&#xff0c; 在 16:07:26.527下线&#xff0c;车云长连接通道稳定&#xff0c;且该期间心跳数据正常。 1.2 云向驾仓推送数据分析 在15:37:42 进行车辆接管后&#xff0c;该车辆下线&#xff0c;且无法在上线&am…

Java语法---使用sort进行排序

目录 一、升序 二、降序 &#xff08;1&#xff09;类实现接口 &#xff08;2&#xff09;匿名内部类 三、自定义排序规则 四、集合中的sort排序 &#xff08;1&#xff09;升序 &#xff08;2&#xff09;降序 &#xff08;3&#xff09;自定义排序 一、升序 升序排…

vue3+Ts

安装 命令含义可参考typescript文章中的自动编译部分 npm create vitelatest vuets-project -- --template vue-tsvs code插件 Vue Language Features (Volar)对.vue文件进行实时的类型错误反馈TypeScript Vue Plugin (Volar) 用于支持在TS中import*.vue文件&#xff08;mai…

08-JVM调优实战及常量池详解

文章目录 阿里巴巴Arthas详解Arthas使用场景Arthas使用 GC日志详解打印GC日志方法如何分析GC日志CMSG1 JVM参数汇总查看命令Class常量池与运行时常量池字面量符号引用 字符串常量池字符串常量池的设计思想三种字符串操作(Jdk1.7 及以上版本)字符串常量池位置字符串常量池设计原…