JSON处理库 -- Fastjson

news2024/11/13 22:15:11

文章目录

  • 一、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[].class
        String[] 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 {
    // 将字符串解析成JSONObject
    static JSONObject parseObject(String str);

    // 将字符串解析成JSONArray
    static 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 {
    @Override
    public 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 {
    @Override
    public String process(Object object, String name, Object value) {
        // 例如,将字段名转为大写
        return name.toUpperCase();
    }
}

  • ValueFilter用于序列化时,修改字段的值
public class MyValueFilter implements ValueFilter {
    @Override
    public Object process(Object object, String name, Object value) {
        // 例如,将所有字符串值转为大写
        if (value instanceof String) {
            return ((String) value).toUpperCase();
        }
        return value;
    }
}

  • ContextValueFilter,多了个提供当前序列化上下文的信息,例如当前对象的类、字段
// 根据字段类型做相应的处理
public class MyContextValueFilter implements ContextValueFilter {
    @Override
    public 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() {
        @Override
        public 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 {

    @Autowired
    private ObjectMapper objectMapper;

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

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

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

相关文章

SpringBoot3集成Spring Authorization Server和Spring Cloud Gateway实现网关统一认证

1. 概述 在微服务开发过程中&#xff0c;通常都会使用Spring Cloud Gateway构建统一的API网关&#xff0c;在访问微服务之前都会先校验访问者是否有权限访问资源&#xff0c;实现方式有很多&#xff0c;这里主要介绍Spring Cloud Gateway集成OAuth2.1如何实现网关统一认证。 S…

公众号里的产品宣传册是如何制作的?

​随着微信的普及&#xff0c;越来越多的企业和个人开始关注公众号&#xff0c;希望通过这个平台宣传自己的产品和服务。然而&#xff0c;你是否想过&#xff0c;那些公众号里精美的产品宣传册是如何制作出来的呢&#xff1f;今天&#xff0c;就让我来带你了解公众号产品宣传册…

解决maven中阿里云镜像仓库无法下载源码的问题

解决 Sources not found for: org.springframework.kafka:spring-kafka:3.2.3 的问题 我们在写代码的时候&#xff0c;经常需要看源码&#xff0c;但是当我们在 idea 中下载源码的时候&#xff0c;提示我们&#xff1a; Sources not found for: org.springframework.kafka:sp…

EmguCV学习笔记 C# 7.2 特征点检测

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

两个月冲刺软考——求解关系模式达到了第几范式题型(例题+讲解,一看就会)

目录 1.假设一对多联系不转换为一个独立的关系模式的话&#xff0c;那么生成的关系模式应该是将“一”的那一方的主键加入到“多”的一方的关系模式中。 2.求解关系模式达到了第几范式题型 1.假设一对多联系不转换为一个独立的关系模式的话&#xff0c;那么生成的关系模式应该…

10 款企业级项目管理系统是你理想中的那一款吗

市面上主流的 10 款企业级项目管理系统推荐&#xff1a;PingCode、Worktile、泛微 e-office、致远OA、Gitee、Asana、Trello、Basecamp、Monday.com、Smartsheet。 在选择合适的企业内部项目管理系统时&#xff0c;许多企业面临着如何找到一个既能满足当前需求&#xff0c;又能…

【生日视频制作】一群美女游轮船挥手AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程一群美女游轮船挥手AE模板修改文字生成器素材 怎么如何做的【生日视频制作】一群美女游轮船挥手AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件 下载AE模板 把AE模板导入AE软件 修改图片或文字 渲染出视频

24年一级消防工程师报名流程图解(建议电脑)

报考流程&#xff1a; 1、登录中国人事考试网&#xff0c;点击网上报名&#xff0c;登录帐户和密.码&#xff0c;找到“一级消防工程师”的报考入口&#xff0c;选择报考省份&#xff0c;进入在线报名界面。 2、报考人员阅读《承诺制告知书》和《报名须知》后&#xff0c;点击“…

【精选】基于Python的电影推荐系统的设计与实现(全网第一无二,最新定制)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

后台框架-统一异常管理

搭建后台框架全局异常管理是一个很重要的部分&#xff0c;好在SpringBoot提供了很好的处理方法 使用ControllerAdvice ControllerAdvice是Spring MVC中的一个全局异常处理注解&#xff0c;它允许在一个地方集中处理所有控制器抛出的异常。通过使用ControllerAdvice&#xff0…

资源不是问题,网盘搜索神器!极空间部署聚合搜索工具『爱盼』

资源不是问题&#xff0c;网盘搜索神器&#xff01;极空间部署聚合搜索工具『爱盼』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 经常分享一些NAS的玩法和攻略&#xff0c;但是被问及最多的还是资源问题&#xff0c;我在那里下载啊&#xff1f;我在那里看啊&#xff1f;等等...…

LLM系列 | 36:Google最新开源大模型:Gemma 2介绍及其微调(下篇)

引言 环境安装 数据准备 下载 处理 模型训练 模型inference 结果 gemma-2-9b gemma-2-9b-it 引言 低头观落日&#xff0c;引手摘飞星。 小伙伴们好&#xff0c;我是微信公众号《小窗幽记机器学习》的小编&#xff1a;卖黑神话的小女孩。本文紧接前文Google最新开源大…

HarmonyOS NEXT未成年人模式无缝联动所有应用,过滤非适龄内容

背景 随着消费电子产品和移动互联网的普及&#xff0c;未成年人互联网普及率96.8%&#xff0c;超过80%的未成年人都拥有自己的上网设备&#xff0c;而如何引导孩子正确上网一直是家长们的担忧。市场上很多电子设备、系统推出了一些未成年人管控能力&#xff0c;却需要家长到各…

前端技术(六)—— AJAX详解

一、原生 AJAX 1. AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML。 通过 AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据。 AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准组…

【练习3】点击消除

地址&#xff1a;点击消除_牛客题霸_牛客网 (nowcoder.com) 分析&#xff1a; 消除的是“相邻且相等”的数&#xff0c;可以考虑用栈。这里使用StringBuilder来代替栈&#xff0c;好处是StringBuilder可以实现尾插和尾删的操作。 public class Main {public static void main(S…

Caching介绍

缓存&#xff08;Caching&#xff09;是计算机系统中一个非常关键且常用的技术&#xff0c;用于提高数据访问速度和系统性能。在Java编程中&#xff0c;缓存同样扮演着重要角色&#xff0c;特别是在处理大量数据、频繁访问数据库或远程服务时。 缓存的基本原理 缓存的基本原理是…

雅特力AT-START-F423开发板

文章目录 1、开箱2、硬件设计3、点灯初试4、gpio输入和中断5、定时器基本定时6、定时器输出PWM7、串口使用8、ADC和DAC测试9、IIC驱动OLED测试10、SPI驱动测试11、总结 1、开箱 最近官方给寄了板子&#xff0c;顺便测评一下吧&#xff0c;首先是开箱环节 板子是调试器开发板的…

栈与队列,优先队列与双端队列(C++)

在C语言阶段&#xff0c;我们学过两种数据结构&#xff0c;栈与队列&#xff0c;一种是先进后出&#xff0c;一种是先进先出。 在C阶段&#xff0c;我们有新容器来方便快捷的使用栈和队列而不需要我们手动来编写 即stack与queue 我们直接来看对应接口 stack 同时放上对应的…

9.标准化与软件知识产权基础知识

大纲 标准的分类 标准的编号 保护期限 知识产权的确定 侵权判断 补充 真题 1

全国大学生数据建模比赛——深度学习

全国大学生数学建模比赛中&#xff0c;深度学习可以成为解决复杂问题的有力手段。 一、深度学习的优势在比赛中的体现 强大的模式识别能力&#xff1a;深度学习模型&#xff0c;如卷积神经网络&#xff08;CNN&#xff09;和循环神经网络&#xff08;RNN&#xff09;&#xff0…