当前位置: 首页 > news >正文

FASTJSON库:阿里出品java界json解析库,使用与踩坑记录

文章目录

  • 一、fastjson2
    • 1、简介
    • 2、使用
    • 3、踩坑:转为List类型,类型擦除,匹配失败
      • (1)引出错误
      • (2)正确转换List
    • 3、踩坑:JsonPath

一、fastjson2

1、简介

FASTJSON v2FASTJSON项目的重要升级,目标是为下一个十年提供一个高性能的JSON库。与fastjson使用同一套API。

fastjson v1版本已经被淘汰了,所以以后就直接用fastjson v2版本。

官方文档:https://alibaba.github.io/fastjson2/

2、使用

<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.60</version></dependency>

在fastjson v2中,package和1.x不一样,是com.alibaba.fastjson2。如果你之前用的是fastjson1,大多数情况直接更包名就即可。

// 1 将JSON解析为JSONObjectStringtext="...";JSONObjectdata=JSON.parseObject(text);byte[]bytes=...;JSONObjectdata=JSON.parseObject(bytes);// 2 将JSON解析为JSONArrayStringtext="...";JSONArraydata=JSON.parseArray(text);// 3 将JSON解析为Java对象Stringtext="...";Userdata=JSON.parseObject(text,User.class);// 4 将Java对象序列化为JSONObjectdata="...";Stringtext=JSON.toJSONString(data);byte[]text=JSON.toJSONBytes(data);// 5. 获取简单属性Stringtext="{\"id\": 2,\"name\": \"fastjson2\"}";JSONObjectobj=JSON.parseObject(text);intid=obj.getIntValue("id");Stringname=obj.getString("name");Stringtext="[2, \"fastjson2\"]";JSONArrayarray=JSON.parseArray(text);intid=array.getIntValue(0);Stringname=array.getString(1);// 6。读取JavaBeanJSONArrayarray=...JSONObjectobj=...Useruser=array.getObject(0,User.class);Useruser=obj.getObject("key",User.class);// 7.转为JavaBeanJSONArrayarray=...JSONObjectobj=...Useruser=obj.toJavaObject(User.class);List<User>users=array.toJavaList(User.class);// 8.将JavaBean对象序列化为JSONclassUser{publicintid;publicStringname;}Useruser=newUser();user.id=2;user.name="FastJson2";Stringtext=JSON.toJSONString(user);byte[]bytes=JSON.toJSONBytes(user);
// 1 将JavaBean对象序列化JSONBUseruser=...;byte[]bytes=JSONB.toBytes(user);byte[]bytes=JSONB.toBytes(user,JSONWriter.Feature.BeanToArray);// 2 将JSONB数据解析为JavaBeanbyte[]bytes=...Useruser=JSONB.parseObject(bytes,User.class);Useruser=JSONB.parseObject(bytes,User.class,JSONReader.Feature.SupportBeanArrayMapping);// 3 使用JSONPath读取部分数据Stringtext=...;JSONPathpath=JSONPath.of("$.id");// 缓存起来重复使用能提升性能JSONReaderparser=JSONReader.of(text);Objectresult=path.extract(parser);// 4 使用JSONPath读取部分byte[]的数据byte[]bytes=...;JSONPathpath=JSONPath.of("$.id");// 缓存起来重复使用能提升性能JSONReaderparser=JSONReader.of(bytes);Objectresult=path.extract(parser);// 5 使用JSONPath读取部分byte[]的数据byte[]bytes=...;JSONPathpath=JSONPath.of("$.id");// 缓存起来重复使用能提升性能JSONReaderparser=JSONReader.ofJSONB(bytes);// 注意这里使用ofJSONB方法Objectresult=path.extract(parser);

3、踩坑:转为List类型,类型擦除,匹配失败

(1)引出错误

观察以下错误:
我们发现,通过JSON.parseObject转换List的时候,因为类型擦除并不会异常,当真正开始使用转换后的对象时,会提示类型转换异常!

importcom.alibaba.fastjson2.JSON;importjava.util.ArrayList;importjava.util.List;publicclassTest{publicstaticvoidmain(String[]args){List<User>users=newArrayList<>();users.add(newUser(1,"张三"));users.add(newUser(2,"李四"));users.add(newUser(3,"王五"));StringusersJson=JSON.toJSONString(users);// [{"id":1,"name":"张三"},{"id":2,"name":"李四"},{"id":3,"name":"王五"}]System.out.println(JSON.toJSONString(usersJson));List<User>usersList1=JSON.parseObject(usersJson,List.class);System.out.println(usersList1);// 下面会报错!!java.lang.ClassCastException: com.alibaba.fastjson2.JSONObject cannot be cast to com.demo.springbootdemo.test.UserSystem.out.println(usersList1.get(0).getId());}}classUser{privateIntegerid;privateStringname;publicUser(Integerid,Stringname){this.id=id;this.name=name;}publicUser(){}publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}}

(2)正确转换List

importcom.alibaba.fastjson2.JSON;importcom.alibaba.fastjson2.TypeReference;importjava.util.ArrayList;importjava.util.List;publicclassTest{publicstaticvoidmain(String[]args){List<User>users=newArrayList<>();users.add(newUser(1,"张三"));users.add(newUser(2,"李四"));users.add(newUser(3,"王五"));StringusersJson=JSON.toJSONString(users);// [{"id":1,"name":"张三"},{"id":2,"name":"李四"},{"id":3,"name":"王五"}]System.out.println(JSON.toJSONString(usersJson));// List<User> usersList1 = JSON.parseObject(usersJson, List.class);// System.out.println(usersList1);// // 下面会报错!!java.lang.ClassCastException: com.alibaba.fastjson2.JSONObject cannot be cast to com.demo.springbootdemo.test.User// System.out.println(usersList1.get(0).getId());// 1.使用parseArray方法转为listList<User>usersList2=JSON.parseArray(usersJson,User.class);System.out.println(usersList2);System.out.println(usersList2.get(0).getId());// 2.使用parseObject方法 + TypeReferenceList<User>userList3=JSON.parseObject(usersJson,newTypeReference<List<User>>(){});System.out.println(userList3);System.out.println(userList3.get(0).getId());}}classUser{privateIntegerid;privateStringname;publicUser(Integerid,Stringname){this.id=id;this.name=name;}publicUser(){}publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}}

3、踩坑:JsonPath

(1)各个版本的JsonPath的API可能有些许差别,但是都是基于JSONPath类来处理,直接调用静态方法即可。

(2)如果jsonpath查询不到对应字段,会返回null。(测试方法:JSONPath.extract(text, path)

http://www.jsqmd.com/news/459514/

相关文章:

  • 高阶函数
  • Qwen3-0.6B-FP8效果展示:FP8量化后中文成语理解、隐喻识别准确率对比
  • 导师不敢说!揭秘7款AI神器,30分钟生成3万字问卷论文 - 麟书学长
  • AutoHotKey 脚本 - win10 自动连接无线显示器
  • Qwen3-8B医疗问答系统实战:合规性与准确性平衡
  • StructBERT中文句向量惊艳效果展示:‘支持微信支付‘vs‘可用微信付款‘相似度0.93
  • Python3.9+GPU加速开发实战:Miniconda环境CUDA配置详解
  • ACE-Step实战案例:短视频配乐自动生成详细步骤
  • GTE中文嵌入模型多场景落地:中文直播弹幕实时聚类与高热话题发现系统
  • Streamlit人脸检测应用开发:cv_resnet101_face-detection_cvpr22papermogface界面定制化指南
  • lingbot-depth-vitl14多分辨率适配教程:448x448/336x336输入尺寸设置与精度影响分析
  • 仿真学习之有限元分析
  • Qwen-Image-Edit从零开始:显存仅需8GB,支持1024×1024高清图编辑教程
  • Fun-ASR识别速度慢?批处理大小与GPU缓存优化实战
  • Sonic数字人视频合成教程:精准控制duration防穿帮
  • 比迪丽SDXL模型部署指南:WebUI开箱即用,6秒出图实操手册
  • DAMO-YOLO手机检测多场景落地:产线质检、课堂监考、零售防盗应用解析
  • STM32 FOC无感控制电机的实现
  • Ubuntu20.04: virt-manager安装后出现QEMU/KVM - Not Connected
  • Ostrakon-VL-8B中小企业落地案例:3人运营团队用该镜像日省2小时人工巡检
  • Nanbeige4.1-3B WebUI定制:支持Markdown渲染、LaTeX公式、代码块高亮增强
  • PyTorch 2.5显存不足?多卡并行优化部署教程一文详解
  • AI读脸术延迟突增?系统资源监控与优化实战
  • OFA视觉问答(VQA)部署教程:NVIDIA Container Toolkit集成说明
  • Chord视频分析工具算力优化:视频解码与模型推理流水线协同设计
  • Vue3辅助生成api接口(鱼皮学习笔记)
  • nlp_structbert_sentence-similarity_chinese-large入门必看:中文NLP语义匹配任务评估指标详解
  • Gemma-3-12B-IT WebUI实战效果:模型蒸馏方案+TinyGemma生成指导
  • 光模块-数字时代的算力传输纽带
  • YOLOv9训练日志分析:loss曲线解读与调优建议