涉及JSON的类型转换(JSON、JSONArray、JSONObject)

 

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就好。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值