一、准备工作
import lombok.Data;
@Data
public class User {
private Long id;
private String name;
}
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class Group {
private Long id;
private String name;
private List<User> users = new ArrayList<User>();
public void addUser(User user) {
users.add(user);
}
}
二、基础用法
1.对象->json
import com.alibaba.fastjson.JSON;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class FastJsonTest {
@Test
void testConvertObject2Json() {
Group group = new Group();
group.setId(1L);
group.setName("admin");
User guestUser = new User();
guestUser.setId(1L);
guestUser.setName("guest");
User rootUser = new User();
rootUser.setId(2L);
rootUser.setName("root");
group.addUser(guestUser);
group.addUser(rootUser);
String jsonString = JSON.toJSONString(group);
System.out.println(jsonString);
}
}
输出
{"id":1,"name":"admin","users":[{"id":1,"name":"guest"},{"id":2,"name":"root"}]}
2.测试json->对象
package com.example.file.process;
import com.alibaba.fastjson.JSON;
import com.example.file.process.pojo.vo.Group;
import com.example.file.process.pojo.vo.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class FastJsonTest2 {
@Test
void testConvertJson2Object() {
String json="{"id":1,"name":"admin","users":[{"id":1,"name":"guest"},{"id":2,"name":"root"}]}";
Group group = JSON.parseObject(json, Group.class);
}
}
三、解析List
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.example.file.process.pojo.vo.Group;
import com.example.file.process.pojo.vo.User;
import com.example.file.process.pojo.vo.WarehouseVO;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class FastJsonTest {
@Test
void testGenericityTransfer(){
String json="[{"id":1,"name":"admin","users":[{"id":1,"name":"guest"},{"id":2,"name":"root"}]},{"id":2,"name":"admin","users":[{"id":3,"name":"guest"},{"id":4,"name":"root"}]}]";
List<Group> groups = JSON.parseObject(json, new TypeReference<List<Group>>() {
});
}
}
四、序列化/反序列化config
fastjson 1.2.57后版本,会识别下划线后缀的名字,比如"id_",如果需要精确匹配使用Feature.DisableFieldSmartMatch。
比如:VO3 vo = JSON.parseObject(text, VO3.class, Feature.DisableFieldSmartMatch);
经测试, 智能匹配可匹配以下集中类型:
- CamelCase,eg:userName
- PascalCase,eg:UserName
- SnakeCase,eg:user_name
- KebabCase,eg:user-name
对User做一些简单改动,增加字段mobilePhone
import lombok.Data;
@Data
public class User {
private Long id;
private String name;
private String mobilePhone;// 增加字段
}
1)代码方式配置序列化/反序列化config
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.example.file.process.pojo.vo.Group;
import com.example.file.process.pojo.vo.User;
import com.example.file.process.pojo.vo.WarehouseVO;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class FastJsonTest {
// 这里演示下序列化配置
// 反序列化
// ParserConfig parserConfig = new ParserConfig(false); // singleton
// parserConfig.propertyNamingStrategy = PropertyNamingStrategy.KebabCase;
// String json=...;
// Group group = JSON.parseObject(text, Group.class, parserConfig);
@Test
void testConfigNamingStrategy() {
SerializeConfig serializeConfig = new SerializeConfig(false); // singleton,需要设置为单例,否则会有性能问题
serializeConfig.propertyNamingStrategy = PropertyNamingStrategy.KebabCase;
Group group = new Group();
group.setId(1L);
group.setName("admin");
User guestUser = new User();
guestUser.setId(1L);
guestUser.setName("guest");
guestUser.setMobilePhone("15380925806");
User rootUser = new User();
rootUser.setId(2L);
rootUser.setName("root");
rootUser.setMobilePhone("13162388512");
group.addUser(guestUser);
group.addUser(rootUser);
String json = JSON.toJSONString(group,serializeConfig);
}
}
输出
{"id":1,"name":"admin","users":[{"id":1,"mobile-phone":"15380925806","name":"guest"},{"id":2,"mobile-phone":"13162388512","name":"root"}]}
2)注解实现序列化/反序列化config
import com.alibaba.fastjson.PropertyNamingStrategy;
import com.alibaba.fastjson.annotation.JSONType;
import lombok.Data;
@Data
@JSONType(naming = PropertyNamingStrategy.SnakeCase)// 指定序列化/反序列化命名
public class User {
private Long id;
private String name;
private String mobilePhone;
}
输出
{"id":1,"name":"admin","users":[{"id":1,"mobile_phone":"15380925806","name":"guest"},{"id":2,"mobile_phone":"13162388512","name":"root"}]}
五、注解配置序列化/反序列化config
对User做一些简单改动
import lombok.Data;
@Data
public class User {
private Long id;
// JSONFiel注解配置映射的json字段名称
@JSONField(name = "userName")
private String name;
}
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.example.file.process.pojo.vo.Group;
import com.example.file.process.pojo.vo.User;
import com.example.file.process.pojo.vo.WarehouseVO;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class FastJsonTest {
@Test
void testJSONFieldAnnotation(){
Group group = new Group();
group.setId(1L);
group.setName("admin");
User guestUser = new User();
guestUser.setId(1L);
guestUser.setName("guest");
User rootUser = new User();
rootUser.setId(2L);
rootUser.setName("root");
group.addUser(guestUser);
group.addUser(rootUser);
String jsonString = JSON.toJSONString(group);
System.out.println(jsonString);
}
}
输出
{"id":1,"name":"admin","users":[{"id":1,"userName":"guest"},{"id":2,"userName":"root"}]}