fastjson相关知识
-
阿里又一个 20k+ stars 开源项目诞生,恭喜 fastjson!个人 GitHub: https://github.com/yanglbme 昨晚,阿里开源库 fastjson stars 数达到了 20k,温绍锦(花名:高铁)作为fastjson、Druid 的作者,发了条朋友圈,表示感谢大家的支持。 下面,我们一起来了解一下 fastjson。 什么是 fastjson? 阿里官方给的定义是, fastjson 是阿里巴巴的开源 JSON 解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。 fastjson 的优点 速度快 fastjson
-
【Json】fastjson与jackson常用操作记录本文只是记录fastjson、jackson一些常用的操作方法,没作比较,网上写比较的文章很多啦。1、对象转Json串// fastjson String objStr =
-
Gson、FastJson、org.JSON到底哪一个效率更高,速度更快Gson、FastJson、org.JSON到底哪一个效率更高,速度更快写博客不易,珍惜笔者劳动成果,转载请标明原创作者地址 http://www.apkbus.com/blog-725636-61364.html?_dsign=d1a2c39f今天无意中再安卓巴士上看到了一片文章《Android开发者应该使用FlatBuffers替代JSON》,吓得我赶紧看了看,突然感觉自己用了好长时间的JSON解析似乎落伍了~~(>_<)~~尤其是看到下面的话,更是不明觉厉;我尝试使用FlatBuffers和JSON解析4mb的JSON文件。FlatBuffers花了1-5ms,JSON花了大约2000ms。在使用FlatBuffers期间Android App中没有GC,而在使用JSON时发生了很多次GC大致看了一下FlatBuffers,似乎挺强大,不过暂时没有测试是不是真有那么快,不过JSON解析应该没有那么慢,于是乎测试了一下平时用到的谷歌的Gson 阿里巴巴的FastJson以及安卓原生
-
Fastjson到了说再见的时候了生命太短暂,不要去做一些根本没有人想要的东西。本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的专栏供以免费学习。 前言 各位小伙伴大家好,我是A哥。停更1个月后回归啦,今天咱们聊聊一个比较有意思的话题:是否真的需要跟Fastjson说再见了? 我的态度 我在CSDN写过好些篇关于JSON的文章,特别是2020年专门写了一个付费专栏:享学Jackson 这个专栏“销量”在我心目中还凑合,4个月“卖出”200份的样子(虽不值一提,但我很满足了?
fastjson相关课程
fastjson相关教程
- 2.2 依赖管理 其实问题并没有完全解决,并不是所有的子模块都需要引入 fastjson-1.2.49.jar 这个依赖,那要怎么办呢?在 POM 中,我们可以在父模块中声明 dependencyManagement 元素,让子模块来继承。dependencyManagement 元素并不会实际的引入依赖,但是可以起到很好的约束依赖的作用。首先,我们在父模块的 pom.xml 文件中声明这个元素,并加入 fastjson-1.2.49.jar 这个依赖。<properties> <fastjson.version>1.2.49</fastjson.version></properties><dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson.version}</version> </dependency> </dependencies></dependencyManagement>然后,我们在 mall-core 模块中添加这个依赖,但是我们并不需要再声明version。<dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> </dependency></dependencies>这时候,我们分别查看父模块与子模块所引入的依赖,会发现,只有子模块中有引入这个依赖,而父模块中,并没有。父模块依赖引入情况 而子模块中已经引入了这个依赖。 子模块依赖引入情况 我们通过 Maven 继承的特性,来进行依赖管理,可以更好的控制依赖的引入。而 Maven 对于插件的管理,也存在类似的元素可以使用(pluginmanagement 元素),可以做到相同的效果。
- 3.1 JsonObject 处理器 JSON 可分为 object 和 array 两大类,分别对应 info 和 tags 字段,这两类需要分别实现类型处理器。由于需要对 JSON 进行处理,我们在 pom.xml 文件中添加上对应的依赖。<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.60</version></dependency>这里,我们使用阿里巴巴开源的 fastjson库。在 com.imooc.mybatis 包下新建 handler 包,并向 handler 包中添加上 json object 的类型处理器 JsonObjectTypeHandler。如下:package com.imooc.mybatis.handler;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import org.apache.ibatis.type.*;import java.sql.CallableStatement;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;@MappedJdbcTypes(JdbcType.VARCHAR) // 对应jdbc 类型@MappedTypes({JSONObject.class}) // 对应处理后类型public class JsonObjectTypeHandler extends BaseTypeHandler<JSONObject> { // 当为 PreparedStatement 参数时,如何处理对象 @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, JSONObject o, JdbcType jdbcType) throws SQLException { preparedStatement.setString(i, JSON.toJSONString(o)); } // 当通过名称从结果中取json字段时如何处理 @Override public JSONObject getNullableResult(ResultSet resultSet, String s) throws SQLException { String t = resultSet.getString(s); return JSON.parseObject(t); } // 当通过序列号从结果中取json字段时如何处理 @Override public JSONObject getNullableResult(ResultSet resultSet, int i) throws SQLException { String t = resultSet.getString(i); return JSON.parseObject(t); } // 当通过序列号从 CallableStatement 中取json字段时如何处理 @Override public JSONObject getNullableResult(CallableStatement callableStatement, int i) throws SQLException { String t = callableStatement.getString(i); return JSON.parseObject(t); }}有了 BaseTypeHandler 作为基础后,实现一个类型处理器就比较简单了,我们只需要为其中 4 个方法添加上对应的实现即可。类型处理器有两个作用,第一处理 Java 对象到 JdbcType 类型的转换,对应 setNonNullParameter 方法;第二处理 JdbcType 类型到 Java 类型的转换,对应 getNullableResult 方法,getNullableResult 有 3 个重载方法。下面我们依次来说明这四个方法的作用:setNonNullParameter:处理 PreparedStatement 中的 JSONObject 参数,当调用 PreparedStatement 执行 SQL 语句时,调用该处理 JSONObject 类型的参数,这里我们通过 fastjson 的JSON.toJSONString(o)函数将 JSONObject 转化为字符串类型即可。getNullableResult:从结果集中获取字段,这里 CallableStatement 和 ResultSet 分别对应不同的执行方式,对于 JDBC 而言 JSON 类型也会当做字符串来处理,因此这里我们需要将字符串类型转化为 JSONObject 类型,对应 JSON.parseObject(t)代码。
- 2.1 config.gradle 我们创建一个单独的config.gradle文件,定义全局变量,如下所示:ext { // 定义一个项目全局变量isRelease,用于动态切换:组件化模式 / 集成化模式 // false: 组件化模式(子模块可以独立运行),true :集成化模式(打包整个项目apk,子模块不可独立运行) isRelease = false // 建立Map存储,对象名、key可以自定义 androidId = [ compileSdkVersion: 28, buildToolsVersion: "29.0.0", minSdkVersion : 19, targetSdkVersion : 28, versionCode : 1, versionName : "1.0" ] appId = ["app" : "com.bthvi.modular", "order" : "com.bthvi.modular.order", "personal": "com.bthvi.modular.personal"] supportLibrary = "28.0.0" dependencies = [ // ${supportLibrary}表示引用一个变量 "appcompat" : "com.android.support:appcompat-v7:${supportLibrary}", "recyclerview": "com.android.support:recyclerview-v7:${supportLibrary}", "constraint" : "com.android.support.constraint:constraint-layout:1.1.3", "okhttp3" : "com.squareup.okhttp3:okhttp:3.10.0", "retrofit" : "com.squareup.retrofit2:retrofit:2.5.0", "fastjson" : "com.alibaba:fastjson:1.2.58", ]}
- 本章须知 本章节会给出前后端简单代码,弱化容错性等增强性需求,重点描述前后端交互的过程和效果。本章节前端使用前面章节封装的 Ajax, 因此本章节代码不涉及封装 Ajax 的相关代码,需要了解的同学可以翻看前面章节。本章节会给出业务相关的前端代码, 前端使用 HTML、Css、和JavaScript,使用 moment.js 库进行时间的格式化。本章节提供 node 后端代码,使用框架为 Express。node 端会使用 MySQL包。本章节也提供相应的 Java 后端代码。本章节 Java 服务端使用 servlet 提供服务。引入了 fastjson 包进行 JSON 的一些列序列化和反序列化的操作;使用 mysql-connector-java 来进行 java 端数据库的连接和操作。
- 5. 常用序列化工具 Java 官方的序列化存在很多缺点,因此,开发者们更倾向于使用优秀的第三方序列化工具来替代 Java 自身的序列化机制。Java 官方的序列化主要体现在以下方面:性能问题:序列化后的数据相对于一些优秀的序列化的工具,还是要大不少,这大大影响存储和传输的效率;繁琐的步骤:Java 官方的序列化一定需要实现 Serializable 接口,略显繁琐,而且需要关注 serialVersionUID;无法跨语言使用:序列化的很大一个目的就是用于不同语言来读写数据。下面列举了一些优秀的序列化工具:thrift、protobuf - 适用于对性能敏感,对开发体验要求不高的内部系统。hessian - 适用于对开发体验敏感,性能有要求的内外部系统。jackson、gson、fastjson - 适用于对序列化后的数据要求有良好的可读性(转为 json 、xml 形式)。
- 3.2 编码和解码实现 3.2.1 依赖坐标<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version></dependency>3.2.2 编码实现public class MyEncoder extends MessageToByteEncoder<BaseBean> { protected void encode( ChannelHandlerContext channelHandlerContext, BaseBean baseBean, ByteBuf byteBuf) throws Exception { //1.把实体序列化成字节数字 byte[] bytes= JSON.toJSONBytes(baseBean); //2.根据协议组装数据 byteBuf.writeInt(baseBean.getTag());//标识(4个字节) byteBuf.writeByte(baseBean.code());//指令(1个字节) byteBuf.writeInt(bytes.length);//长度(4个字节) byteBuf.writeBytes(bytes);// }}3.2.3 解码实现public class MyDecoder extends ByteToMessageDecoder { protected void decode( ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception { //1.根据协议取出数据 int tag=byteBuf.readInt();//标识符 byte code=byteBuf.readByte();//获取指令 int len=byteBuf.readInt();//获取数据长度 byte[] bytes=new byte[len]; byteBuf.readBytes(bytes); //2.根据code获取类型 Class<? extends BaseBean> c= MapUtils.getBean(code); //3.反序列化 BaseBean baseBean=JSON.parseObject(bytes,c); list.add(baseBean); }}3.2.4 指令和实体关系为什么需要这么一个工具类呢?指令表示的是业务类型,不同的业务对应不同的实体,那么解码的时候,怎么知道反序列化成什么样的实体呢?思路是获取到的指令,再根据指令找到对应的实体即可。public class MapUtils { //1.自定义指令 private static Byte codeLoginReq=1; private static Byte codeLoginRes=2; private static Byte codeMsgReq=3; private static Byte codeMsgRes=4; private static Byte codeMsgRec=5; //2.自定义一个Map,专门管理指令和实体的关系 private static Map<Byte, Class<? extends BaseBean>> map=new HashMap<Byte,Class<? extends BaseBean>>(); //3.初始化 static { map.put(codeLoginReq, LoginReqBean.class); map.put(codeLoginRes, LoginResBean.class); map.put(codeMsgReq, MsgReqBean.class); map.put(codeMsgRes, MsgResBean.class); map.put(codeMsgRec, MsgRecBean.class); } //4.根据指令获取对应的实体 public static Class<? extends BaseBean> getBean(Byte code){ try{ return map.get(code); }catch (Exception e){ throw new RuntimeException(e.getMessage()); } }}
fastjson相关搜索
-
face
fade
fadein
fadeout
fadeto
fail
family
fastcgi
fastjson
fault
fclose
fdisk
feed
fetch
ff浏览器
fgets
fields
fieldset
fighting
figure