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.全面性校对:工具支持…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
