简介
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 Repsoitory</name>
<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> |
序列化
一个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","r":255,"g":0,"b":0,"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,"g":0,"b":0,"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());
出自: |
相关推荐
在Java开发中,处理JSON数据时通常会用到一些库,如`com.alibaba.fastjson.JSON` 和 `net.sf.json.JSONObject`。这两个库分别是阿里巴巴的Fastjson和Eclipse的Json-lib。 首先,我们来详细了解一下`...
Fastjson的性能表现也非常出色,它采用了高效的优化算法,提供了极快的JSON解析速度。在处理大数据量的JSON时,Fastjson的效率往往优于其他同类库。 总的来说,阿里巴巴的Fastjson库通过其核心类JSONObject,为Java...
`com.alibaba.fastjson`是阿里巴巴开发的...在处理JSON数据时,`fastjson`的高效、易用和全面性使得它成为首选的JSON解析库。通过理解并熟练使用`fastjson`,开发者可以提高代码的可读性和运行效率,简化数据处理流程。
一旦完成,就可以通过`import com.alibaba.fastjson.JSON;`和`import com.alibaba.fastjson.JSONArray;`来引入所需的类。`JSON`类是Fastjson的核心,提供了基本的JSON操作,如对象与JSON字符串之间的转换,而`...
Fastjson是阿里巴巴开源的一个高性能的JSON库,它可以解析JSON文本并将其转化为Java对象,同时也可以将Java对象转化为JSON文本。Fastjson的核心特性包括:极快的性能、简单易用的API以及对Java语言特性的良好支持。 ...
网上都说fastjson很方便,很多教程说如何使用但是却没有jar包,这个版本是2020年目前最新的fastjson-1.2.73
- 使用`Fastjson`非常直观,只需要简单的几行代码就能完成JSON与Java对象的转换。例如,`JSON.toJSONString(obj)`可以将Java对象转换为JSON字符串,而`JSON.parseObject(jsonString, YourClass.class)`则能将JSON...
在Java开发中,`com.alibaba.fastjson.JSONObject`是阿里巴巴开源库Fastjson的重要组成部分,它提供了一种高效、方便的方式来处理JSON数据。Fastjson是Java语言编写的高性能功能完备的JSON库,广泛应用于各种Java...
本文将详细介绍如何在Android Studio中使用FastJSON进行JSON解析和生成。 首先,理解JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于ECMAScript的一个子集,采用完全独立于语言的文本格式,...
本文将深入探讨三种广泛使用的JSON解析库:原生的`json`库,阿里巴巴的`fastjson`,以及Google的`gson`。 ### 1. 原生`json`库 Android系统内建了一个简单的`org.json`库,提供基本的JSON操作。它包括`JSONObject`...
《阿里巴巴JSON解析库Fastjson详解》 在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,广泛应用于服务器与客户端之间的数据传输。而阿里巴巴的Fastjson库,便是针对Java平台设计的...
在实际使用中,Fastjson提供了一种简单的“解析-生成”模型,使得开发者可以轻松地进行JSON与Java对象之间的相互转换。例如,要将一个JSON字符串转化为Java对象,只需要使用`JSON.parseObject()`方法,反之,若要将...
《深入解析Fastjson 1.2.66版本》 Fastjson是阿里巴巴开源的一个高性能的JSON库,它在Java世界中被广泛使用,为开发者提供了快速、方便地处理JSON数据的能力。Fastjson 1.2.66是该库的一个稳定版本,其核心功能包括...
fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。 主要特点: 快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson”>jackson) 强大(支持普通JDK类...
总之,Fastjson是Java开发中处理JSON数据的理想选择,其强大的功能和高效的性能使得它可以轻松应对各种复杂的JSON解析和序列化任务。通过`JSONTest`这样的示例代码,我们可以更好地理解和掌握如何利用Fastjson进行...
Fastjson是阿里巴巴推出的一款Java语言编写的高性能功能完备的JSON库,以其解析速度快、使用简便的特点,在Java开发领域备受青睐。本篇文章将深入探讨Fastjson的原理与使用方法,帮助开发者更好地理解和运用这一强大...
import com.alibaba.fastjson.JSON; public class User { private String name; private int age; // getters and setters public static void main(String[] args) { User user = new User(); user.set...
2. 引入Fastjson的相关类,如`com.alibaba.fastjson.JSON`和`com.alibaba.fastjson.JSONObject`等。 3. 使用Fastjson的API进行JSON操作,例如: ```java import com.alibaba.fastjson.JSON; import ...
本示例"JSON解析demo.zip"提供的可能是一个使用自定义封装类快速解析JSON数据的实例,这对于简化代码和提高效率非常有用。 首先,我们来了解`org.json`库中的主要类: 1. **JSONObject**:代表一个JSON对象,它由...
此外,这个版本还引入了新的API和配置选项,使得开发者能够更灵活地控制JSON解析和生成的过程。 使用Fastjson时,需要注意以下几点: 1. 异常处理:在进行JSON转换时,可能会遇到JSON格式错误或类型不匹配等问题,...