加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Fastjson简介 - 转

发布时间:2020-12-16 19:16:38 所属栏目:百科 来源:网络整理
导读:简介 Fastjson 是一个 Java 语言编写的高性能功能完善的 JSON 库。 高性能 fastjson 采用独创的算法,将 parse 的速度提升到极致,超过所有 json 库,包括曾经号称最 快的 jackson。并且还超越了 google 的二进制协议 protocol buf。 支持标准 Fastjson 完全

简介 Fastjson 是一个 Java 语言编写的高性能功能完善的 JSON 库。

高性能 fastjson 采用独创的算法,将 parse 的速度提升到极致,超过所有 json 库,包括曾经号称最 快的 jackson。并且还超越了 google 的二进制协议 protocol buf。

支持标准 Fastjson 完全支持 http://json.org 的标准,也是官方网站收录的参考实现之一。

功 能强大 支持各种 JDK 类型。包括基本类型、JavaBean、Collection、Map、Enum、泛型等。 支持循环引用 无依赖 不需要例外额外的 jar,能够直接跑在 JDK 上。 支持范围广 支持 JDK 5、JDK 6、Android、阿里云手机等环境。 开源 Apache License 2.0 代码托管在 github.org 上,项目地址是 https://github.com/AlibabaTech/fastjson 测试充分 fastjson 有超过 1500 个 testcase,每次构建都会跑一遍,丰富的测试场景保证了功能稳定。 获得 fastjson 下载 http://code.alibabatech.com/mvn/releases/com/alibaba/fastjson/ maven 配置如下: 如果你使用了 Maven,maven repository 配置如下: , <repository> <id>opensesame</id> <name>Alibaba OpenSource <url>http://code.alibabatech.com/mvn/releases/</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> pom.xml 文件中加入依赖依赖: 文件中加入依赖依赖: <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.14</version> </dependency>

Repsoitory</name>

序列化 一个 JSON 库涉及的最基本功能就是序列化和反序列化。Fastjson 支持 java bean 的直接序列 化。你可以使用 com.alibaba.fastjson.JSON 这个类进行序列化和反序列化。

基 本序列化 序列化就是把 JavaBean 对象转化成 JSON 格式的文本。 Object o = ...; String text = JSON.toJSONString(o); 在这个例子中,调用 JSON.toJSONString 方法,把对象 o 转化为 JSON 格式的文本。

使用单引号 标准的 JSON 是使用双引号的,javascript 支持使用单引号格式的 json 文本,fastjson 也支持 这个特性,打开 SerializerFeature.UseSingleQuotes 这个特性就可以了了,例如: Object o = ...; String text = JSON.toJSONString(o,SerializerFeature.UseSingleQuotes); fastjson 序列化时可以选择的 SerializerFeature 有十几个, 你可以按照自己的需要去选择使用。

日期格式化 fastjson 直接支持日期类型数据的格式化, 包括 java.util.Date、 java.sql.Date、 java.sql.Timestamp、 java.sql.Time。 缺省情况下,fastjson 将 Date 类型序列化为 long,这个使得序列化和反序列化的过程不会导 致时区问题。如: 例如: long millis = 1324138987429L; Date date = new Date(millis); System.out.println(JSON.toJSONString(date)); 输出的结果是 1324138987429 fastjson 还提供了基于格式化输出的 SerializerFeature,例如: JSON.toJSONString(date,SerializerFeature.WriteDateUseDateFormat); 输出的结果为: "2011-12-18 00:23:07"

你 可以指定输出日期的格式,比如修改为输出毫秒: JSON.toJSONStringWithDateFormat(date,"yyyy-MM-dd HH:mm:ss.SSS"); 输出的结果为: "2011-12-18 00:23:07.429" 使用 WriteClassName 特性 fastjson 支持序列化时写入类型信息,从而使得反序列化时不至于类型信息丢失。例如: Color color = Color.RED; String text = JSON.toJSONString(color,SerializerFeature.WriteClassName); System.out.println(text);

输出结果: {"@type":"java.awt.Color","r":255,"g":0,"b":0,"alpha":255}

由 于序列化带了类型信息,使得反序列化时能够自动进行类型识别,例如: String text = ...; // {"@type":"java.awt.Color","alpha":255} Color color = (Color) JSON.parse(text);

浏览器和设备兼容 fastjson 缺省的序列化内容, 是对序列化结果紧凑做了优化配置, 使得序列化之后长度更小, 但是这种优化配置是对一些浏览器和设备不兼容的。 比如说在 iphone 上兼容 emoji (绘文字) 。 JSON.toJSONString(o,SerializerFeature.BrowserCompatible);

循 环引用 很多场景中,我们需要序列化的对象中存在循环引用,在许多的 json 库中,这会导致 stackoverflow。在功能强大的 fastjson 中,你不需要担心这个问题。例如: A a = new A(); B b = new B(a); a.setB(b); String text = JSON.toJSONString(a); // {"b":{"a":{"$ref":".."}}} A a1 = JSON.parSEObject(text,A.class); Assert.assertTrue(a1 == a1.getB().getA());

引用是通过"$ref"来表示的 来表示的 引用是通过 引用 描述 "$ref":".." 上一级 "$ref":"@" 当前对象,也就是自引用 "$ref":"$" 根对象 "$ref":"$.children.0" 基于路径的引用,相当于 root.getChildren().get(0) 使用@JSONField Annotation 使用 在某些场景,你可能需要定制序列化输出,比如说,希望序列化采用之后采用"ID",而不是 "id",你可以使用@JSONField 这个 Annotation。 public class User { @JSONField(name="ID") public int getId() { ... } } User user = ...; JSON.toJSONString(user); // {"ID":234} 从 json-lib 中升级 如果你已经使用了 json-lib, 并且痛恨他蜗牛般的速度和罗嗦的 API, 建议你升级为 fastjson, fastjson 可以完全兼容 json-lib 的序列化格式。 import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.JSONLibDataFormatSerializer; import com.alibaba.fastjson.serializer.JSONSerializerMap; import com.alibaba.fastjson.serializer.SerializerFeature; private static final SerializeConfig config;

static { config = new SerializeConfig(); config.put(java.util.Date.class,new JSONLibDataFormatSerializer()); // 使用和 json-lib 兼容的 日期输出格式 config.put(java.sql.Date.class,new JSONLibDataFormatSerializer()); // 使用和 json-lib 兼容的 日期输出格式 } private static final SerializerFeature[] features = { SerializerFeature.WriteMapNullValue,// 输出空置字段 SerializerFeature.WriteNullListAsEmpty,// list 字段如果为 null,输出为[],而不是 null SerializerFeature.WriteNullNumberAsZero,// 数值字段如果为 null,输出为 0,而不是 null SerializerFeature.WriteNullBooleanAsFalse,// Boolean 字段如果为 null,输出为 false,而不 是 null SerializerFeature.WriteNullStringAsEmpty // 字符类型字段如果为 null,输出为"",而不是 null }; // 序列化为和 JSON-LIB 兼容的字符串 public static String toCompatibleJSONString(Object object) { return JSON.toJSONString(object,config,features); } 通过上面代码中的 toCompatibleJSONString 方法,你就可以实现完全兼容 json-lib 了。

反序列化 反序列化就是把 JSON 格式的文本转化为 Java Bean 对象。 指定 Class 信息反序列化 通过指定类型信息,可以很方便的将"JSON 文本"反序列化为"Java Bean"对象,例如: String text = ...; // {"r":255,"alpha":255} Color color = JSON.parSEObject(text,Color.class);

类型集合的反序列化 这个接口类似于 parSEObject String text = ...; // [{ ... },{ ... }] List<User> users = JSON.parseArray(text,User.class);

泛型的反序列化 如果你需要返回一个带泛型的对象,例如 List<User>、Map<String,User>,你可以使用 TypeReference 来传入类型信息。 String text = ...; // {"name":{"name":"ljw",age:18}} Map<String,User> userMap = JSON.parSEObject(text,new TypeReference<Map<String,User>>() {});

组合类型集合的反序列化 比如在网络协议中,经常会存在这样的组合: [{/*header*/},{/*body*/}] fastjson 对这种结构的反序列化有专门支持。

String text = ...; // [{/* header */},{/* body */}] Type[] types = new Type[] {Header.class,Body.class}; List<Object> list = JSON.parseArray(text,types); Header header = (Header) list.get(0); Body body = (Body) list.get(1);

使用@JSONCreator 来指定构造函数来创建对象 使用 如果你的 JavaBean 没有缺省构造函数,可以使用@JSONCreator 来指定构造函数 public static class Entity { private final int id; private final String name; @JSONCreator public Entity(@JSONField(name = "id") int id,@JSONField(name = "name") String name){ this.id = id; this.name = name; } public int getId() { return id; } public String getName() { return name; } } 把 JSON 文本反序列化为一个原型接口 public static interface Bean { int getId(); void setId(int value); String getName(); void setName(String value); } String text = "{"id":123,"name":"chris"}"; Bean bean = JSON.parSEObject(text,Bean.class); // 按接口调用 Assert.assertEquals(123,bean.getId()); Assert.assertEquals("chris",bean.getName()); bean.setId(234); Assert.assertEquals(234,bean.getId());

From: http://5xts.com/read/49921c01683932433465b06b.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读