FastJson在Java后端方面解析使用(二)
JSON现在常用来做前后端数据交互,两个蝴蝶飞只是简单的对JSON做一下讲解和简单使用。关于JSON,我还了解的远远不够。由于本人经验有限,嘴皮子不溜,所以学术性,概念性,底层性的知识点暂时不做介绍。文章中有错误之处,欢迎拍砖和指点。在此,特别向阿里团队表示感谢,谢谢他们开发出了FastJSON这么好用的Jar包,并且免费开源出来。 两个蝴蝶飞只是粗浅的谈一下使用,非常抱歉,未能理解前辈们深邃的思想。
上一章简单介绍了JSON简介及前端简单解析(一),如果没有看过,请观看上一章
一 FastJSON简短介绍
JSON协议使用方便,越来越流行,JSON的处理器有很多,这里我介绍一下FastJson,FastJson是阿里的开源框架,被不少企业使用,是一个极其优秀的Json框架。
FastJson的特点:
1.FastJson数度快,无论序列化和反序列化,都是当之无愧的fast
2.功能强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
3.零依赖(没有依赖其它任何类库)
首先要下载fastjson的jar包。github地址: https://github.com/alibaba/fastjson
这里只牵扯到后端方面,用Junit4框架进行测试
二 FastJSON三个类的简单介绍
FastJSON包中有三个常用的对象,JSON,JSONObject,JSONArray三个对象。
二.一 JSON类
public abstract class JSON implements JSONStreamAware, JSONAware{}
JSON类实现了JSONStreamAware和JSONAware接口。
JSONAware接口:
package com.alibaba.fastjson;
public abstract interface JSONAware
{//转换成JSON类型的字符串public abstract String toJSONString();
}
JSONStreamAware接口:
public abstract interface JSONStreamAware //JSON+流+Aware 能力
{// 向里面写Appendable, 追加。 转换成JSON字符串public abstract void writeJSONString(Appendable paramAppendable)throws IOException;
}
Appendable接口:
public interface Appendable {
//添加字符串Appendable append(CharSequence csq) throws IOException;
//添加的字符串,可以截取 start,endAppendable append(CharSequence csq, int start, int end) throws IOException;
//添加单个字符Appendable append(char c) throws IOException;
}
二.二 JSONObject 类
public class JSONObject extends JSONimplements Map<String, Object>, Cloneable, Serializable, InvocationHandler{}
JSONObject类继承了JSON类,实现了Map接口,Cloneable(克隆接口),序列化(Serializable),InvocationHandler(调用处理器)
InvocationHandler.java
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable;
默认值为16。
所以JSONObject主要存储的方式是以Map<Key,Value>的形式进行相应的存储。存储的是单值形式。
构造方法:
public JSONObject(Map<String, Object> map) {this.map = map;}
二.三 JSONArray类
public class JSONArray extends JSONimplements List<Object>, Cloneable, RandomAccess, Serializable{}
JSONArray类也继承了JSON类, 实现了List接口,Cloneable克隆接口,Serializable 序列化接口,RandomAccess接口。
public interface RandomAccess {}
实现了List接口,是以数组的形式进行相应的存储。
构造方法:
public JSONArray(List<Object> list) {this.list = list;}
JSONObject和JSONArray均实现了JSON类,故一般都是用子类,即单值用JSONObject,集合用JSONArray。
三 JSONObject类的具体使用
三.一 转换成普通字符串格式
转换的格式为: var obj={“name”:“两个蝴蝶飞”,“age”:24,“sex”:“男”};
代码为:
/*** 一个普通的字符串格式.* var obj={"name":"两个蝴蝶飞","age":24,"sex":"男"};* 用JSONObject进行添加.*/@Testpublic void testString1(){//空构造JSONObject json=new JSONObject();//内部使用的是map结构,put放置值json.put("id",1);json.put("name","两个蝴蝶飞");json.put("age",24);json.put("sex","男");//转换成json字符串. toJSONString()String result=json.toJSONString();System.out.println(result);}
是字符串格式。
三.二 将JSON字符串进行解析取值
@Test/** 解析JSON字符串* {"name":"两个蝴蝶飞","age":24,"sex":"男"};*/public void testToString1(){String source="{'name':'两个蝴蝶飞','age':24,'sex':'男'}";//利用静态方法parseObject(source),将要解析的资源放进去JSONObject json=JSON.parseObject(source);//取得数据时 可以取得具体的类型System.out.println(json.getIntValue("age"));System.out.println(json.getString("sex"));System.out.println(json.getString("name"));}
三.三 利用Map显式放置值
@Test/*** 前面带一个前缀. 用添加Map* {"person":{"name":"两个蝴蝶飞","age":24,"sex":"男"}}*/public void testString2(){Map<String,Object> map=new HashMap<String,Object>();map.put("name","岳建立");map.put("age",24);map.put("sex","男");JSONObject json=new JSONObject();json.put("person",map);String result=json.toJSONString();System.out.println(result);//如果不要前缀,可以直接 {"name":"两个蝴蝶飞","age":24,"sex":"男"}//System.out.println(JSON.toJSONString(map));}
三.四 取出Map中的值
@Testpublic void testToString2(){String source="{\"person\":{\"sex\":\"男\",\"name\":\"岳建立\",\"age\":24}}";JSONObject json=JSON.parseObject(source);System.out.println(json.getString("person"));// {"name":"两个蝴蝶飞","age":24,"sex":"男"}//继续取出JSONObject json2=JSON.parseObject(json.getString("person"));System.out.println(json2.getString("name"));System.out.println(json2.getString("sex"));System.out.println(json2.getIntValue("age"));}
四 JSONArray的使用
如果属性过多的话,那么就需要用一个User类进行相应的封装了。即开始引入对象了。
引入相应的User的类
package com.fastjson.pojo;
/***author 作者 两个蝴蝶飞*version 创建时间 2018年9月16日下午3:42:37
*/
public class User {private int id;private String name;private int age;private String sex;private String content;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + ", age=" + age + "]";}
}
四.一 JSONArray 配置单个JavaBean类
- 前缀没有用key值:
@Test/*** 将一个单对象转换成JSON格式* {"age":24,"content":"一个小小的程序员","id":1,"name":"两个蝴蝶飞","sex":"男"}*/public void testUser1(){User user=new User();user.setId(1);user.setName("两个蝴蝶飞");user.setSex("男");user.setAge(24);user.setContent("一个小小的程序员");//直接用JSON.toJSONString(); toJSONString(user)String result=JSON.toJSONString(user);System.out.println(result);}
- 前缀有key值
@Test
public void testUser1(){User user=new User();user.setId(1);user.setName("两个蝴蝶飞");user.setSex("男");user.setAge(24);user.setContent("一个小小的程序员");//用JSONObjectJSONObject json=new JSONObject();json.put("user",user);String result=json.toJSONString();System.out.println(result);}
- 取出没有key值的Java Bean
@Testpublic void testToUser4(){String source="{\"age\":24,\"content\":\"一个小小的程序员\",\"id\":1,\"name\":\"两个蝴蝶飞\",\"sex\":\"男\"}";//直接转换成对象User user1=JSON.parseObject(source,User.class);System.out.println(user1);}
- 取出有key值的的Java Bean
@Testpublic void testToUser1(){String source="{\"user\":{\"age\":24,\"content\":\"一个小小的程序员\",\"id\":1,\"name\":\"两个蝴蝶飞\",\"sex\":\"男\"}}";//直接转换成对象//先取出后面的值String result=JSON.parseObject(source).getString("user");
//继承转换User user1=JSON.parseObject(result,User.class);System.out.println(user1);}
四.二 JSONArray 配置List 集合
@Test//将一个对象数组集合添加到JSON中,用JSONArray/*{"persons":[{"age":0,"content":"小小的程序员而已0","id":0,"name":"两个蝴蝶飞0","sex":"男"},{"age":0,"content":"小小的程序员而已1","id":1,"name":"两个蝴蝶飞1","sex":"女"},{"age":0,"content":"小小的程序员而已2","id":2,"name":"两个蝴蝶飞2","sex":"男"}]}*/public void testUser2(){List<User> users = new ArrayList<User>(); for (int i = 0; i < 3; i++) { User u = new User(); u.setId((i));u.setName("两个蝴蝶飞"+i);u.setContent("小小的程序员而已"+i);u.setSex(i % 2 == 0 ? "男" : "女"); users.add(u); }//String result=JSON.toJSONString(users);JSONObject json=new JSONObject();json.put("persons",users);String result=json.toJSONString();System.out.println(result);}
解析List集合
@Testpublic void testToUser2(){String resource="{\"list\":[{\"id\":0,\"name\":\"两个蝴蝶飞0\",\"sex\":\"男\"} {\"id\":1,\"name\":\"两个蝴蝶飞1\",\"sex\":\"女\"},{\"id\":2,\"name\":\"两个蝴蝶飞2\",\"sex\":\"男\"}]}";String text=JSON.parseObject(resource).getString("list");//现在,这已经是一个数组了.如何将数组进行解析呢? 用JSONArrayJSONArray arrays=JSON.parseArray(text);List<User> allList=new ArrayList<User>();for(int i=0;i<arrays.size();i++){//用toJavaObject toJavaObjectUser u=JSON.toJavaObject(arrays.getJSONObject(i),User.class);allList.add(u);}for (User user : allList) {System.out.println(user.getId()+","+user.getName());}}
这是常用的几种解析方式。谢谢
解析成功,谢谢!!!
相关文章:
FastJson在Java后端方面解析使用(二)
JSON现在常用来做前后端数据交互,两个蝴蝶飞只是简单的对JSON做一下讲解和简单使用。关于JSON,我还了解的远远不够。由于本人经验有限,嘴皮子不溜,所以学术性,概念性,底层性的知识点暂时不做介绍。文章中有错误之处…...
PyTorch深度学习实战(5)——计算机视觉基础
PyTorch深度学习实战(5)——计算机视觉基础 0. 前言1. 图像表示2. 将图像转换为结构化数组2.1 灰度图像表示2.2 彩色图像表示3 利用神经网络进行图像分析的优势小结系列链接0. 前言 计算机视觉是指通过计算机系统对图像和视频进行处理和分析,利用计算机算法和方法,使计算机…...
ImageReader保存图片转 opencvmat
目录 ImageReader 直接保存图片,没成功,格式是yuv420,需要转换 转opencv nv21保存图片,测试ok rgb888 data保存图片: ImageReader 直接保存图片,没成功,格式是yuv420,需要转换 …...
【vue3+ts项目】配置husky+配置commitlint
上一篇文章中配置了eslint校验代码工具 【vue3ts项目】配置eslint校验代码工具,eslintprettierstylelint 1、配置husky 每次手动执行命令才能格式化代码,如果有人没有格式化就提交到远程仓库,这个规范就起不到作用了,所有需要强…...
html实现iframe全屏
前言 html浏览器全屏操作,基于jquery iframe全屏、指定标签全屏 实现 css /** 全屏*/ .lay-dbclick-box{position: relative;width: 100%;height: 100%; } .lay-dbclick-screen{position: absolute;top: 0;left: 0;width: 100%;height: 100%;z-index: 999999999…...
【es6】中的Generator
Generator 一、Generator 是什么?1.1 与普通函数写法不一样,有两个不同 二、Generator 使用2.1 书写方法 三、yield语句3.1 yield和return3.2 注意事项3.3 yield*语句3.4 yield*应用 四、next方法4.1参数4.2 运行逻辑 五、异步解决方案六、Generator相关…...
桥梁安全监测方法和内容是什么?
桥梁安全监测方法和内容是什么?桥梁监测是保障桥梁安全和稳定的重要手段。随着科技的进步,桥梁监测技术和设备不断完善,监测内容也越来越全面。本文万宾科技小编将为大家介绍桥梁安全监测的方法和内容,以期帮助大家更好地了解这一领域。 桥梁…...
prometheus部署及钉钉告警集成Grafana
1、准备工作 安装包 📎alertmanager-0.23.0.linux-amd64.tar.gz 📎node_exporter-1.3.1.linux-amd64.tar.gz 📎prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz 服务端口 Prometheus 9090 node_exporter 9100 alertmanager …...
Java百度提前批面试题
今天分享百度提前批的 Java 后端开发面经,整体上考察的点挺多的,主要重点考察了网络i/o、网络协议、linux系统、mysql,Java 问的不多,可能是百度的后端开发的语言不是主要以 Java 为主,所以重点看面试者的计算机基础是…...
Go语言中的Oop面向对象
Go In OOp 一、 Go是面向对象的吗?二、Structs Instead of Classes 结构体 - OOP in Go三、 Composition Instead of Inheritance 组合嵌套 - OOP in Go1.Composition by embedding structs2. Embedding slice of structs 四、Polymorphism 多态 - OOP in Go1. Polymorphism u…...
Duplicate keys detected: ‘1‘. This may cause an update error.
报错 Duplicate keys detected: ‘1’. This may cause an update error. 注释: 检测到重复密钥:‘1’。这可能会导致更新错误。 解决 首先判断是因为for循环导致的,检查是否出现重复。 笔者是同一个页面两处for循环导致...
C++(8.21)c++初步
1.斐波那契: #include <iostream> #include<iomanip>using namespace std;int main() {cout << "Hello World!" << endl;int a[10];for(int i0;i<10;i){if(0i||1i){a[i]1;}elsea[i]a[i-1]a[i-2];cout <<setw(4) <&l…...
【【Verilog典型电路设计之log函数的Verilog HDL设计】】
Verilog典型电路设计之log函数的Verilog HDL设计 log函数是一种典型的单目计算函数,与其相应的还有指数函数、三角函数等。对于单目计算函数的硬件加速器设计一般两种简单方法:一种是查找表的方式;一种是使用泰勒级数展开成多项式进行近似计算。这两种方式在设计方…...
数字放大(C++)
系列文章目录 1.进阶的卡沙_睡觉觉觉得的博客-CSDN博客 2. 数1的个数_睡觉觉觉得的博客-CSDN博客 3. 双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客 4. 足球联赛积分_睡觉觉觉得的博客-CSDN博客 5. 大减价(一级)_睡觉觉觉得的博客-CSDN博客 6. 小写字母的判断_睡觉觉觉得…...
FOC控制框架图
pmsm电机数学模型以及FOC控制框图(开源小项目FOC控制BLDC电机)_foc 框图_栋哥爱做饭的博客-CSDN博客 电机控制----FOC框架讲解_foc电机控制_修才生的博客-CSDN博客...
Spring工具类(获取bean,发布事件)
spring-beans-5.3.1.jar Component public final class SpringUtils implements BeanFactoryPostProcessor{/*** Spring应用上下文环境*/private static ConfigurableListableBeanFactory beanFactory;//初始化成员变量Overridepublic void postProcessBeanFactory(Configurab…...
腾讯云和阿里云服务器折扣对比_看看哪家划算?
阿里云服务器和腾讯云服务器根据购买时长可以享受一定的优惠折扣,综合对比下来腾讯云折扣更低,阿腾云来对比下阿里云和腾讯云的云服务器根据购买时长可以享受的常规折扣对比: 目录 阿里云和腾讯云折扣对比 阿里云服务器常规折扣 腾讯云服…...
GO语言中的Defer与Error异常报错详细教程
目录标题 一、Defer1. Example2. Deferred methods 延迟方法3. Arguments evaluation 延迟参数4. Stack of defers 延迟程序堆栈5. Practical use of defer 实际使用 二、Error1. Example2. PathError3. DNSError4. Direct Comparison 直接比较5. Do not ignore errors 不要忽略…...
AP6315 DC单节锂电池充电IC 同步2A锂电芯片
概述 是一款面向5V交流适配器的2A锂离子电池充电器。它是采用1.5MHz固定频率的同步降压型转换器,因此具有高达90%以上的充电效率,自身发热量极小。包括完整的充电终止电路、自动再充电和一个达1%的4.2V预设充电电压,内部集成了防反灌保护、输…...
PDF校对工具正式上线,为用户提供卓越的文档校对解决方案
为满足当下对数字化文档校对的精准需求,我们今日正式发布全新的PDF校对工具。经过深入的技术研发与细致的测试,该工具旨在为企业和个人用户带来一个高效且准确的PDF文档校对平台。 PDF校对工具的主要特性: 1.全面性校对:工具支持…...
Python自动化办公:3种绕过VBA宏直接操作Word目录的实战方法(附完整代码)
Python自动化办公:3种绕过VBA宏直接操作Word目录的实战方法 在数字化转型浪潮中,企业文档处理正面临前所未有的效率挑战。当我们需要批量更新数百份Word文档的目录时,传统VBA宏方案常因安全警告、格式限制和跨平台兼容性问题而举步维艰。本文…...
CM1数值模拟新手避坑指南:从namelist.input配置到并行计算实战
CM1数值模拟新手避坑指南:从namelist.input配置到并行计算实战 刚接触CM1模式的研究人员常常会在配置文件和并行计算环节踩坑——某个参数设置不当可能导致数小时的计算结果突然崩溃,或是并行效率低下浪费计算资源。本文将用真实案例拆解那些文档里没写…...
UniApp二维码生成避坑指南:解决常见Canvas渲染问题
UniApp二维码生成避坑指南:解决常见Canvas渲染问题 在移动应用开发中,二维码功能已成为用户交互的标配。UniApp作为跨平台开发框架,其Canvas组件在实现二维码生成时却存在诸多"暗礁"。本文将深入剖析五个典型场景下的Canvas渲染陷阱…...
PDF-Extract-Kit-1.0教育应用:教材习题自动识别与题库构建
PDF-Extract-Kit-1.0教育应用:教材习题自动识别与题库构建 1. 引言 老师们每天都要面对一大堆教材PDF,里面藏着无数宝贵的习题资源。但手动把这些题目一个个抄出来,整理成电子题库,简直是个噩梦——费时费力还容易出错。有没有什…...
AI-Agent元年来了!2026年全面爆发,掌握Agent工程化思维,从0到1打造爆款智能体!
前言 如果说[2025年是AI-Agent元年],那么2026年无疑是AI-Agent全面爆发的一年。无论是近期引发全民热潮的“养虾”智能体[OpenClaw,还是渗透进各行各业、解决实际工作问题的智能助手,它们都属于AI-Agent的生动实践。从这些案例中不难看出&…...
避坑指南:用Dify搭建AI Agent时,Docker镜像拉取失败和Postman接口调试的那些坑
避坑指南:用Dify搭建AI Agent时的高频问题解决方案 当你第一次尝试用Dify搭建AI Agent时,可能会遇到各种意想不到的"坑"。从Docker镜像拉取失败到Postman接口调试报错,每一步都可能让新手开发者抓狂。本文将聚焦这些实操中的真实痛…...
FireRedASR Pro应用案例:会议录音转文字,提升工作效率实测
FireRedASR Pro应用案例:会议录音转文字,提升工作效率实测 1. 会议记录痛点与解决方案 1.1 传统会议记录的效率瓶颈 在职场工作中,会议记录是一项耗时且容易出错的任务。根据调研数据显示: 普通员工平均每周花费4-6小时在会议…...
Dify新手必看:3种创建应用的方法全解析(附模板使用技巧)
Dify新手必看:3种创建应用的方法全解析(附模板使用技巧) 第一次打开Dify工作室时,面对琳琅满目的功能选项,很多开发者都会感到无从下手。作为一个从零开始接触Dify的过来人,我完全理解这种困惑——毕竟当初…...
nli-distilroberta-base在数据库智能查询中的应用:自然语言转SQL实战
nli-distilroberta-base在数据库智能查询中的应用:自然语言转SQL实战 1. 引言:当自然语言遇上数据库查询 "帮我找出上个月销售额超过10万的产品"——这样的需求如果能让数据库直接理解该多好?传统SQL查询需要专业技术人员编写复杂…...
eMMC5.1协议详解:从CMD0到CSD寄存器,手把手教你读懂关键命令
eMMC5.1协议深度解析:关键命令与寄存器实战指南 在嵌入式存储领域,eMMC5.1协议作为主流存储解决方案的核心规范,其命令集与寄存器操作直接决定了设备性能与稳定性。本文将聚焦协议中最关键的CMD命令序列与CSD寄存器结构,通过实际示…...
