1、导依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
2、创建POJO对象()
public class Myuser {
private int id;
private String username;
private String userpwd;
private String usersex;
private Integer version;
private Date createTime;
private Date updateTime;
}
3、在测试方法中初始化对象“老大”
Myuser myuser1 = new Myuser();
myuser1.setId(1);
myuser1.setUsername("老大");
myuser1.setUsersex("male");
myuser1.setUserpwd("123");
4、转化“老大”
JSON.toJSONString 将“老大”转换为JSON格式的String:
String receiverOfPOJO = JSON.toJSONString(myuser1); System.out.println(receiverOfPOJO);
输出结果:
{"id":1,"username":"老大","userpwd":"123","usersex":"male"}
plus:为啥不直接用myuser1.toString()呢?
System.out.println(myuser1.toString());
输出
Myuser(id=1, username=老大, userpwd=123, usersex=male, version=null, createTime=null, updateTime=null)
对比发现:toString()方法不满足JSON格式,且JSON转换的字符串会把未赋值(null)的属性忽略掉,比如你会发现我们没有给version等属性赋值,JSON字符串中就看不到了。
JSONObject.parseObject 将String类型的“老大”再转化为Myuser类型(注意传入了Myuser.class,告诉parseObject要转换的目标类型):
Myuser receiverOfJSONObject = JSONObject.parseObject(receiverOfPOJO, Myuser.class); System.out.println(myuser1.equals(receiverOfJSONObject));
输出结果
true
5、建立“老二”,生成List对象
Myuser myuser2 = new Myuser();
myuser2.setId(2);
myuser2.setUsername("老二");
myuser2.setUsersex("male");
myuser2.setUserpwd("abc");
List<Myuser> myusers = new ArrayList<>();
myusers.add(myuser1);
myusers.add(myuser2);
6、转换list
JSON.toJSONString 将list对象转换为JSON格式字符串
String receiverOfList = JSON.toJSONString(myusers); System.out.println(receiverOfList); System.out.println(myusers.toString());
输出:
[{"id":1,"username":"老大","userpwd":"123","usersex":"male"},{"id":2,"username":"老二","userpwd":"abc","usersex":"male"}] [Myuser(id=1, username=老大, userpwd=123, usersex=male, version=null, createTime=null, updateTime=null), Myuser(id=2, username=老二, userpwd=abc, usersex=male, version=null, createTime=null, updateTime=null)]
依旧对比JSON转换的字符串和toString方法转换的字符串发现区别同上。
JSONArray.parseArray将JSON格式的List字符串转换为List<User>
List<Myuser> receiverOfJSONList = JSONArray.parseArray(receiverOfList,Myuser.class); System.out.println(receiverOfJSONList.equals(myusers));
输出:
true
List也是Object,为什么不能用JSONObject.parseObject(XX,T.class);呢?
List<Myuser> receiverOfJSONList = JSONArray.parseArray(receiverOfList,Myuser.class); List<Myuser> receiverOfJSONList2 = JSONArray.parseObject(receiverOfList,List.class); // receiverOfJSONLis2t = JSONArray.parseObject(receiverOfList,Myuser.class); System.out.println(receiverOfJSONList); System.out.println(receiverOfJSONList2); System.out.println(receiverOfJSONList2.equals(receiverOfJSONList));
输出:
[Myuser(id=1, username=老大, userpwd=123, usersex=male, version=null, createTime=null, updateTime=null), Myuser(id=2, username=老二, userpwd=abc, usersex=male, version=null, createTime=null, updateTime=null)] [{"usersex":"male","userpwd":"123","id":1,"username":"老大"}, {"usersex":"male","userpwd":"abc","id":2,"username":"老二"}] false
先说JSONArray.parseObject(receiverOfList,Myuser.class) :这是不被允许的,所以代码中被注解掉了。因为List首先是一个序列,然后是指定泛型(Myuser)的序列。所以你要先传入一个List.class。
再说JSONArray.parseObject(receiverOfList,List.class) :语法检查通过,查看输出也是有相关内容,可是看着就像JSON字符串,明显不是JAVA内存要求的格式([Myuser(...)]),再看看得到的是个哪个类的:
System.out.println(receiverOfJSONList2.get(1).getClass());
获取的应该是“老二”,但是报错了:
java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.hfy.demo.pojo.Myuser
看来对receiverOfJSONList2的访问都是你好我好,但是涉及到对其中元素的访问就会报错,因为从未给过Myuser.class, JSONObject无法自动转换。
所以List就用JSONArray就好。