JSON处理库 -- Fastjson

2024-09-02 00:04
文章标签 json 处理 fastjson

本文主要是介绍JSON处理库 -- Fastjson,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、json格式
    • 1.1 用途
    • 1.2 语法
    • 1.3 常见格式
  • 二、fastjson常用类
    • 2.1 JSONObject
    • 2.2 JSONArray
  • 三、序列化和反序列化
    • 3.1 默认序列化与反序列化
    • 3.2 序列化的扩展
    • 3.3 自定义序列化SerializeFilter
    • 3.4 @JSONField 注解
    • 3.5 复习Jackson

在这里插入图片描述

一、json格式

1.1 用途

  • 一种轻量级的数据交换格式
  • 用于数据传输和存储

json格式用于数据传输,常见的如前后端数据交互。而用于数据存储,常见的如一些NoSQL 数据库(如 MongoDB)用json格式来存储数据。

1.2 语法

json即大括号包围的一些键值对的集合,每个键值对之间用逗号分隔,键值对的键的类型一定是String,键值对的值的类型可以是:

  • 字符串、数字、布尔
  • 空值null
  • 一个对象
{"name": "Alice","age": 25,"isStudent": false
}
  • 数组,且数组里元素的类型可以是上面提到的json类型中的任意一种
["apple", "banana", "cherry"]
[{"name": "Alice","age": 25},{"name": "Bob","age": 30}
]

1.3 常见格式

就上面提到的json类型,常见的json串,如:

  • 简单对象
{"key1": "value1","key2": "value2"
}
  • 嵌套对象
{"person": {"name": "Alice","age": 25},"address": {"street": "123 Main St","city": "Springfield"}
}
  • 数组
{"fruits": ["apple", "banana", "cherry"],"numbers": [1, 2, 3, 4]
}

二、fastjson常用类

用于json结构的操作、json串和对象之间的序列化与反序列化的一个库

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

2.1 JSONObject

  • 用于创建、读取、修改和管理 JSON
  • JSONObject,结构上,看成是 Map<String,Object>

源码:三个构造方法如下

在这里插入图片描述

基本使用:增删改键值对

public static void main(String[] args) {JSONObject jsonObject = new JSONObject();// 向json里添加键值对jsonObject.put("name", "Tom");jsonObject.put("age", 24);jsonObject.put("isStudent", true);jsonObject.put("hobby", new String[]{"reading", "music"});// 修改json里的键值对jsonObject.put("name", "TomPlus");// 移除json里的键值对jsonObject.remove("age");// 转String格式System.out.println(jsonObject.toJSONString());}

在这里插入图片描述

JSON 字符串转JSONObject对象

public class Demo {public static void main(String[] args) {String jsonString = "{\"name\":\"TomPlus\",\"age\":24,\"isStudent\":true,\"hobby\":[\"reading\",\"music\"]}";// Json串解析为JSONObject对象JSONObject jsonObject = JSONObject.parseObject(jsonString);// 访问数据String name = jsonObject.getString("name");int age = jsonObject.getIntValue("age");Boolean isStudent = jsonObject.getBoolean("isStudent");// 数组类型,String[].classString[] hobby = jsonObject.getObject("hobby", String[].class);System.out.println(hobby[0]);}
}

2.2 JSONArray

JSONArray,即JSONObject的集合,List<Object>

在这里插入图片描述

相关方法:

在这里插入图片描述

此外,JSONAarray是支持Stream流的:

JSONArray jsonArray = new JSONArray();
jsonArray.add("test");
jsonArray.add("code");
JSONObject jsonObject = new JSONObject();
jsonArray.add(jsonObject);
jsonArray.remove(2);jsonArray.forEach(System.out::println);List<String> list = jsonArray.stream().map(e -> e + " stream").collect(Collectors.toList());
System.out.println(list);

s

三、序列化和反序列化

fastjson有个抽象类,其是JSONObject类的父类

在这里插入图片描述

JSON类常用的方法:

class JSON {// 将字符串解析成JSONObjectstatic JSONObject parseObject(String str);// 将字符串解析成JSONArraystatic JSONArray parseArray(String str);// 将字符串解析成Java对象static T parseObject(byte[] utf8Bytes, Class<T> objectClass);// 将Java对象输出成字符串static String toJSONString(Object object);// 将Java对象输出成UTF8编码的byte[]static byte[] toJSONBytes(Object object);
}

3.1 默认序列化与反序列化

序列化默认会调用类的Getter方法:

// 序列化
String text = JSON.toJSONString(obj);

如果类没有Getter,序列化的结果是空的:

在这里插入图片描述

Person person = new Person("Tom", 24);
String str = JSON.toJSONString(person);
System.out.println(str);

反序列化成对象:默认调用无参构造来创建对象:

Person person = JSON.parseObject("{...}", Person.class); //反序列化

示例:

String objectStr = "{\"age\":24,\"name\":\"Tom\"}";
Person result = JSON.parseObject(objectStr, Person.class);
System.out.println(result);

3.2 序列化的扩展

直接使用枚举类SerializerFeature,里面可以选择序列化的一些扩展:

  • SerializerFeature.BeanToArray:序列化时,不再返回正常的json串,而是返回一个数组,数组中存的是Java对象的熟性的值:

在这里插入图片描述

  • SerializerFeature.WriteNullStringAsEmpty:序列化时,值为null的,处理成""

在这里插入图片描述

一些其他枚举值:

在这里插入图片描述

3.3 自定义序列化SerializeFilter

实现FastJson的SerializeFilter接口,进行高度的定制化自定义序列化。以下实现几个SerializeFilter的常用实现类:

  • PropertyFilter用于序列化时过滤掉特定的属性
public class MyPropertyFilter implements PropertyFilter {@Overridepublic boolean apply(Object object, String name, Object value) {// 例如,排除所有值为 null 的属性return value != null;}
}
// 示例
Person person = new Person();
// 设置属性
String jsonString = JSON.toJSONString(person, new MyPropertyFilter());
  • NameFilter用于序列化时修改字段的名称
public class MyNameFilter implements NameFilter {@Overridepublic String process(Object object, String name, Object value) {// 例如,将字段名转为大写return name.toUpperCase();}
}
  • ValueFilter用于序列化时,修改字段的值
public class MyValueFilter implements ValueFilter {@Overridepublic Object process(Object object, String name, Object value) {// 例如,将所有字符串值转为大写if (value instanceof String) {return ((String) value).toUpperCase();}return value;}
}
  • ContextValueFilter,多了个提供当前序列化上下文的信息,例如当前对象的类、字段
// 根据字段类型做相应的处理
public class MyContextValueFilter implements ContextValueFilter {@Overridepublic Object process(BeanContext context, Object object, String name, Object value) {return object;}
}

ContextValueFilter举例:这里直接用内部类了

public static void main(String[] args) {Person person = new Person(24,"Tom");// 后面的反序列化操作,可以传多个String str = JSON.toJSONString(person, new ContextValueFilter() {@Overridepublic Object process(BeanContext beanContext, Object obj, String key, Object value) {try {Field field = beanContext.getBeanClass().getDeclaredField(key);Class<?> type = field.getType();if (type.equals(String.class)) {return "plus " + value;} else if (type.equals(int.class)) {return (Integer)value * 2;}} catch (NoSuchFieldException e) {e.printStackTrace();}return value;}});System.out.println(str);
}

在这里插入图片描述

3.4 @JSONField 注解

注解的属性:

  • name:指定序列化时JSON 中字段的名称
  • serializeUsing:指定自定义的序列化器
  • deserializeUsing:指定自定义的反序列化器
  • format:用于指定日期时间的格式
  • ordinal:指定序列化得到的json串中,字段的顺序
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;public class MyClass {// 将 myField 映射为 JSON 中的 my_name 字段@JSONField(name = "my_name")private String myField;@JSONField(format = "yyyy-MM-dd")private java.util.Date myDate;// getters and setters
}// 使用示例
public class Main {public static void main(String[] args) {MyClass obj = new MyClass();obj.setMyField("example");obj.setMyDate(new java.util.Date());String json = JSON.toJSONString(obj);System.out.println(json); // 输出:{"my_name":"example","myDate":"2024-09-01"}MyClass parsedObj = JSON.parseObject(json, MyClass.class);System.out.println(parsedObj.getMyField()); // 输出:example}
}

3.5 复习Jackson

  • 序列化与反序列化的自定义,还可以通过Jackson框架(ObjectMapper)的注解:@JsonCreator和@JsonValule

  • Jackson和FastJson都是处理json串,做序列化和反序列化的,前者对注解的支持完善些,后者则是轻量

  • SpringBoot项目中,默认的序列化框架是Jackson,这一点,从spring-web-starter往下跟就可以发现,或者使用SpringBoot的自动装配,来看其核心类ObjectMapper是否为空判定

在这里插入图片描述

@RunWith(SpringRunner.class)
@SpringBootTest
public class JsonTest {@Autowiredprivate ObjectMapper objectMapper;@Testpublic void testJacksonObjectMapper() {assertNotNull(objectMapper);}
}
  • 如果要使用 Fastjson 或其他 JSON 处理库,必须自定义配置来替换 Jackson。如通过配置 FastjsonHttpMessageConverter 来替换默认的 Jackson 转换器

这篇关于JSON处理库 -- Fastjson的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128423

相关文章

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各