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 转换器

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

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

相关文章

浅谈SpringMvc的核心流程与组件

一、SpringMvc的核心流程 当发起请求时被前置的控制器(DispatcherServlet)拦截到请求&#xff0c;根据请求参数生成代理请求&#xff0c;找到请求对应的实际控制器&#xff0c;控制器处理请求&#xff0c;创建数据模型&#xff0c;访问数据库&#xff0c;将模型响应给中心控制…

扑捉一只耿鬼(HTML文件)

图例&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>耿鬼</title><style>body {background: #fff;font-family: Comfortaa, sans-serif;}* {box-sizing:…

Unet改进12:添加PCONV||减少冗余计算和同时存储访问

本文内容:添加PCONV 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 为了设计快速的神经网络,许多工作都集中在减少浮点运算(FLOPs)的数量上。然而,我们观察到FLOPs的这种减少并不一定会导致类似程度的延迟减少。这主要源于低效率的每秒浮点操作数(FLOP…

Bean 的实例化(创建 | 获取)

Spring为Bean提供了多种实例化方式&#xff0c;包括如下4种方式&#xff1a; 第一种&#xff1a;通过构造方法实例化第二种&#xff1a;通过简单工厂模式实例化第三种&#xff1a;通过factory-bean实例化&#xff08;工厂方法模式实例化&#xff09;第四种&#xff1a;通过Fact…

盘点java8 stream中隐藏的函数式接口

shigen坚持更新文章的博客写手&#xff0c;记录成长&#xff0c;分享认知&#xff0c;留住感动。个人IP&#xff1a;shigen 提到函数式接口&#xff0c;最常见的就是lambda表达式&#xff0c;IDEA也有智能的提示&#xff1a; 最后改成这样的就是最简洁的、IDEA希望的风格&#…

Android UI绘制原理:UI的绘制流程是怎么样呢?为什么子线程不能刷新UI呢?讲解大体的流程是怎么样的

目录&#xff1a; 一、 为什么要学习android UI绘制原理呢&#xff1f;对我们有什么帮助&#xff1f; 1.解决复杂布局问题&#xff1a;了解UI绘制原理可以帮助我们更好地理解和解决布局问题&#xff0c;比如使用自定义View、优化布局层级等。 2.知道何时触发布局&#xff08;…

【AI大模型】基于docker部署向量数据库Milvus和可视化工具Attu详解步骤

&#x1f680; 作者 &#xff1a;“大数据小禅” &#x1f680; 文章简介 &#xff1a;本专栏后续将持续更新大模型相关文章&#xff0c;从开发到微调到应用&#xff0c;需要下载好的模型包可私。 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 目…

zdppy_cache缓存框架升级,支持用户级别的缓存隔离,支持超级管理员管理普通用户的缓存

启动服务 import zdppy_api as api import zdppy_cachekey1 "admin" key2 "admin"app api.Api(routes[*zdppy_cache.zdppy_api.cache(key1, key2, api) ])if __name__ __main__:import zdppy_uvicornzdppy_uvicorn.run(app, host"0.0.0.0",…

TEngine框架之HybridCLR代码热更

自HybridCLR热更方案出现以来&#xff0c;像之前的主流toLua/xLua/ILRuntime瞬间不香了&#xff0c;算是跨世代的产物引起业界不小的轰动。HybridCLR是一个特性完整、零成本、高性能、低内存的近乎完美的Unity全平台原生c#热更新解决方案。想要详细了解HibirdCLR原理和使用的&a…

初爽Stream流

体验Stream流的作用&#xff1a; 需求&#xff1a; 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素 要求&#xff1a; 1.把所有以“张”开头的元素存储到新集合中 2.把“张”开头的&#xff0c;长度为3的元素再存储到新集合中 3.遍历打…

【C++ | 设计模式】代理模式的详解与实现

1. 概念 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;用于控制对对象的访问。它通过引入代理对象&#xff0c;间接地操作目标对象&#xff0c;从而实现对目标对象的控制。代理模式的核心思想是通过代理对象来控制对目标对象的访问。代理对…

kubenetes--资源调度

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 出自B站博主教程笔记&#xff1a; 完整版Kubernetes&#xff08;K8S&#xff09;全套入门微服务实战项目&#xff0c;带你一站式深入掌握K8S核心能…

【Python】如何使用pip,安装第三方库和生成二维码、操作Excel

文章目录 第三方库使用 pip安装第三方库 生成二维码1. 确定使用哪个库2. 查看对应文档3. 开始操作 操作 Excel1. 安装 xlrd2. 编写代码 第三方库 第三方库就是别人已经实现好了的库&#xff0c;我们可以拿过来直接使用 虽然标准库已经很强大了&#xff0c;但是终究是有限的&am…

MLM之Qwen:Qwen2-VL的简介、安装和使用方法、案例应用之详细攻略

MLM之Qwen&#xff1a;Qwen2-VL的简介、安装和使用方法、案例应用之详细攻略 目录 Qwen2-VL的简介 1、主要增强功能&#xff1a; 2、模型架构更新&#xff1a; 3、性能 图像基准测试 视频基准测试 代理基准测试 多语言基准测试 4、新闻 5、限制 Qwen2-VL的安装和使用…

微服务间调用

一、restTemplate 1、先将restTemplate注册成为一个bean Configuration public class RemoteCallConfig {Beanpublic RestTemplate restTemplate() {return new RestTemplate();} }2、实现代码 private void handleCartItems(List<CartVO> vos) {// TODO 1.获取商品id…

【网络安全】服务基础第一阶段——第八节:Windows系统管理基础---- Web服务与虚拟主机

目录 一、WWW概述 1.1 HTML 1.2 URI与URL 1.2.1 URL&#xff08;统一资源标识符&#xff0c;Uniform Resource Locator&#xff09; 1.3 HTTP 1.3.1 HTTP请求&#xff1a; 1.3.2 HTTP响应 1.3.3 状态码 1.4常见Web URL格式 实验一、网站搭建 1&#xff09;访问失败可…

如何基于numpy和scipy实现曲面的最大梯度计算与显示

大家在做三维可视化研究过程中,经常需要做三维曲面的绘制和相交分析,在不知道三维曲面方程的情况下,如何基于曲面散点数据计算曲面的最大梯度点和梯度线的三维可视化是大家基于曲面分析研究中的重点关注的问题,本文在python环境下,基于numpy、pandas、scipy和matplotlib等…

超详细Git基本命令使用(二)

&#x1f600;前言 本篇博文是关于 Git基本命令的使用&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f6…

【C++】list的使用和list的模拟实现和迭代器失效问题

目录 一、list 的简单介绍 二、list 的基本使用 &#x1f389;list的构造 &#x1f389;list iterator 的使用 &#x1f389;list capacity &#x1f389;list element access &#x1f389;list modifiers &#x1f389;list operator 三、list 的模拟实现 &#x…

【一个简单的整数问题】

问题 TLE代码 #include <bits/stdc.h> using namespace std; const int N 1e510; int b[N]; void add(int l, int r, int d) {b[r1] - d;b[l] d; } int query(int x) {int retval 0;for(int i 1; i < x; i){retval b[i];}return retval; } int main() {int n, m…