一、FastJson的主要入口
Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。
//序列化
public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
public static final Object toJSON(Object javaObject); //将JavaBean转换为JSONObject或者JSONArray。
public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本,这种不常用
//反序列化
public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean
public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合
二、有关类库的说明
SerializeWriter:相当于StringBuffer。
JSONArray:相当于List<Object>。
JSONObject:相当于Map<String, Object>。
JSON反序列化没有真正数组,本质类型都是List<Object>。JSONArray和JSONObject都继承了JSON类,所以,才会说JSON类是主要入口。
三、测试
基础类
@Data
public class User {
@JSONField(ordinal = 2 )
private String name;
@JSONField(ordinal = 3 , format = "yyyy-MM-dd HH:mm:ss")
private Date birthDay;
@JSONField(ordinal = 1 )
private Integer age;
}
--------------------------------
@Data
public class Group {
private String groupName;
private List<User> userList = new ArrayList<User>();
}
- JavaBean对象与JSONStr的相互转换
@Test
public void beanAndJsonStr(){
User user = new User();
user.setName("zhangsan");
user.setAge(10);
user.setBirthDay(new Date());
System.out.println("beanToJsonStr");
String userJsonStr = JSON.toJSONString(user);
System.out.println(userJsonStr);
System.out.println("JsonStrToBean");
User user1 = JSON.parseObject(userJsonStr, User.class);
System.out.println(user1);
}
//结果:
beanToJsonStr
{"age":10,"name":"zhangsan","birthDay":"2018-11-06 10:51:11"}
JsonStrToBean
User(name=zhangsan, birthDay=Tue Nov 06 10:51:11 CST 2018, age=10)
- JavaBean对象与JSONObj的相互转换
@Test
public void beanAndJsonObj(){
User user = new User();
user.setName("zhangsan");
user.setAge(10);
user.setBirthDay(new Date());
System.out.println("beanToJsonObj");
JSONObject userJsonObj = (JSONObject)JSON.toJSON(user);
System.out.println(userJsonObj);
System.out.println("JsonToBeanObj");
User user1 = JSON.parseObject(userJsonObj.toString(), User.class);
System.out.println(user1);
}
//结果:
beanToJsonObj
{"birthDay":1541473800956,"name":"zhangsan","age":10}
JsonToBeanObj
User(name=zhangsan, birthDay=Tue Nov 06 11:10:00 CST 2018, age=10)
这里需要注意,如果JSONObj需要转换成javaBean,那么需要先将JSONObj转换成字符串(调用JSONObject的toString方法),然后再将字符串反序列化成JavaBean对象。
- List与JSONStr的相互转换
@Test
public void listAndJsonStr(){
List<User> userList = new ArrayList<User>();
User user = new User();
user.setName("zhangsan");
user.setAge(10);
user.setBirthDay(new Date());
User user2 = new User();
user2.setName("lisi");
user2.setAge(11);
user2.setBirthDay(new Date());
userList.add(user);
userList.add(user2);
System.out.println("listToJsonStr");
String userListJsonStr = JSON.toJSONString(userList);
System.out.println(userListJsonStr);
System.out.println("JsonStrToList");
List<User> list = JSON.parseArray(userListJsonStr, User.class);
System.out.println(list);
}
//结果:
[{"age":10,"name":"zhangsan","birthDay":"2018-11-06 20:32:52"},{"age":11,"name":"lisi","birthDay":"2018-11-06 20:32:52"}]
JsonStrToList
[User(name=zhangsan, birthDay=Tue Nov 06 20:32:52 CST 2018, age=10), User(name=lisi, birthDay=Tue Nov 06 20:32:52 CST 2018, age=11)]
- List与JSONObj的相互转换
@Test
public void listAndJsonObj(){
List<User> userList = new ArrayList<User>();
User user = new User();
user.setName("zhangsan");
user.setAge(10);
user.setBirthDay(new Date());
User user2 = new User();
user2.setName("lisi");
user2.setAge(11);
user2.setBirthDay(new Date());
userList.add(user);
userList.add(user2);
System.out.println("listToJsonObj");
JSONArray userListJsonObj = (JSONArray)JSON.toJSON(userList);
System.out.println(userListJsonObj);
System.out.println("JsonObjToList");
List<User> list = JSON.parseArray(userListJsonObj.toString(), User.class);
System.out.println(list);
}
//结果:
listToJsonObj
[{"birthDay":1541508280432,"name":"zhangsan","age":10},{"birthDay":1541508280432,"name":"lisi","age":11}]
JsonObjToList
[User(name=zhangsan, birthDay=Tue Nov 06 20:44:40 CST 2018, age=10), User(name=lisi, birthDay=Tue Nov 06 20:44:40 CST 2018, age=11)]
- map与JSONStr的相互转换
@Test
public void mapAndJsonStr(){
Map<String,User> map = new HashMap<String,User>();
User user = new User();
user.setName("zhangsan");
user.setAge(10);
user.setBirthDay(new Date());
User user2 = new User();
user2.setName("lisi");
user2.setAge(11);
user2.setBirthDay(new Date());
map.put("用户1",user);
map.put("用户2",user2);
System.out.println("mapToJsonStr");
String mapStr = JSON.toJSONString(map);
System.out.println(mapStr);
System.out.println("JsonStrToMap");
Map map3 = JSON.parseObject(mapStr);
//JSONObject map3 = JSON.parseObject(mapStr);
Map<String,User> map2 = (Map<String,User>)JSON.parse(mapStr);
//JSONObject map2 = (JSONObject)JSON.parse(mapStr);
for (Object str:map3.keySet()) {
System.out.println(map2.get(str));
}
}
//结果:
mapToJsonStr
{"用户2":{"age":11,"name":"lisi","birthDay":"2018-11-06 20:47:31"},"用户1":{"age":10,"name":"zhangsan","birthDay":"2018-11-06 20:47:31"}}
JsonStrToMap
{"birthDay":"2018-11-06 20:47:31","name":"lisi","age":11}
{"birthDay":"2018-11-06 20:47:31","name":"zhangsan","age":10}
Map map3 = JSON.parseObject(mapStr);
JSONObject map3 = JSON.parseObject(mapStr);
Map<String,User> map2 = (Map<String,User>)JSON.parse(mapStr);
JSONObject map2 = (JSONObject)JSON.parse(mapStr);
当时map的时候,JSON.parseObject(mapStr)和JSON.parse(mapStr)返回的类型不一样,这是因为JSONObject类实现了Map<String, Object>接口,可参考JSONObject源码。
同理,JSONArray实现了 List<Object>接口。
map和JSONObj的相互转换,Array和JSONStr以及JSONObji的相互转换,都和上述的一样,所以在此就不陈述了。
四、总结
Java对象序列化成字符串,都可以用JSON.toString()方法。
字符串反序列化成Java对象时:
如果是JavaBean,则可用JSON.parseObject(String text , Class<T> clazz)方法。
如果是数组(Array或者List),则可用JSON.parseArray(String text , Class<T> clazz)方法。
如果是Map,则可用JSON.parse(String text)或者JSON.parseObject(String text)方法。
如果Java对象需要转成JSON对象,则可用JSON.toJSON(Object javaObject)方法,将JavaBean转成JSONObject或者JSONArray。
如果字符串需要反序列成JSON对象,分两种情况:
如果是数组,则可用JSON.parseArray(String text)或者JSON.parse(String text)方法,把JSON字符串parse成JSONArray。
如果是Java对象,则可用JSON.parseObject(String text)或者JSON.parse(String text),把JSON字符串parse成JSONObject。