一、简介
fastjson是阿里巴巴开源的一个高性能、功能强大、使用广泛的Java JSON库,具有对Java对象和JSON字符串的自动转换、支持任意复杂度的JSON格式、支持Java泛型、支持Java注解、支持流式API等特性。fastjson不但在Java语言中广泛使用,而且还有多种语言、平台的实现,如.NET、Python、iOS、Android等,成为各个领域、各个语言中最流行的JSON解析工具之一。
二、使用示例
下面是一个简单的fastjson使用示例:
public class User {
private String name;
private int age;
//setter和getter方法
}
User user = new User();
user.setName("张三");
user.setAge(20);
String jsonString = JSON.toJSON(user).toString(); //对象转JSON字符串
User newUser = JSON.parseObject(jsonString, User.class); //JSON字符串转对象
三、JSON格式支持
fastjson支持任意复杂度的JSON格式,如下所示:
{
"name":"张三",
"age":20,
"address": {
"province":"广东",
"city":"深圳",
"street":"科技园路"
},
"friends":[
{
"name":"李四",
"age":18
},
{
"name":"王五",
"age":21
}
]
}
fastjson还支持非标准的JSON格式,如以下两种情况:
四、Java泛型支持
fastjson能够很好地支持Java泛型,如下所示:
public class ListResponse<T> {
private int total;
private List<T> list;
//setter和getter方法
}
ListResponse<User> response = new ListResponse<>();
response.setTotal(2);
List<User> userList = new ArrayList<>();
User user1 = new User();
user1.setName("张三");
user1.setAge(20);
User user2 = new User();
user2.setName("李四");
user2.setAge(18);
userList.add(user1);
userList.add(user2);
response.setList(userList);
String jsonString = JSON.toJSON(response).toString(); //对象转JSON字符串
ListResponse<User> newResponse = JSON.parseObject(jsonString, new TypeReference<ListResponse<User>>(){});
//JSON字符串转对象
五、注解支持
fastjson支持对Java对象的属性使用注解进行标记。目前,fastjson支持的注解有以下四种:
- @JSONField:可以用来指定JSON字符串与Java对象属性之间的映射关系。
- @JSONType:可以用来指定Java类的序列化和反序列化时的行为。
- @JSONCreator:可以用来指定JSON字符串中几个属性值,如何构造Java对象。
- @JSONPOJOBuilder:可以用来指定如何构建Java对象。
下面是一个使用@JSONField注解的示例:
public class User {
@JSONField(name = "user_name")
private String name;
@JSONField(name = "user_age")
private int age;
//setter和getter方法
}
六、流式API支持
fastjson还提供了流式API的支持,可以逐步构建JSON字符串。
String jsonString = JSON
.createObjectWriter()
.startObject()
.writeKey("name")
.writeValue("张三")
.writeKey("age")
.writeValue(20)
.endObject()
.toString();
七、扩展方法支持
fastjson还支持扩展方法,可以轻松地添加和使用自定义功能。例如,可以添加一个判断字符串是否为纯数字的方法:
public class JSONUtils {
public static boolean isNumeric(String str) {
if (str == null || str.length() == 0) {
return false;
}
for (char c : str.toCharArray()) {
if (!Character.isDigit(c)) {
return false;
}
}
return true;
}
}
//使用方法
JSONValidator.registerValidator(String.class, new Validator() {
@Override
public boolean validate(ValidatorContext context, Object value) {
return JSONUtils.isNumeric((String) value);
}
});
JSON.toJSONString("123456", SerializerFeature.WriteClassName, SerializerFeature.QuoteFieldNames);