fastjson坑记录-对象转JSON多字段

fastjson 简介

Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。

Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。

Fastjson 源码地址:https://github.com/alibaba/fastjson

Fastjson 中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN

直接上代码

因为是公司的项目,所以就自己写了一个小demo来复现一下这个坑,直接上代码.

先定义一个类User

public class User {

    public String name;

    public void setName(String name){
        this.name = name;
    }
    public static void main(String[] args) {
        User user = new User();
        user.setName("夏洛特");
        String json = JSONObject.toJSONString(user);
        System.out.println(json);
    }
    }

跑一下main方法,这样是没问题的输出:{“name”:“夏洛特”}
之后在User对象中加入一个getMaDongMei()方法,方法返回一个字符串

public class User {

    public String name;

    public void setName(String name){
        this.name = name;
    }

    public String getMaDongMei(){
        return "马冬梅";
    }

    public static void main(String[] args) {
        User user = new User();
        user.setName("夏洛特");
        String json = JSONObject.toJSONString(user);
        System.err.println(json);
    }

}

这个时候问题就出来了
输出:{“maDongMei”:“马冬梅”,“name”:“夏洛特”}
fastjson会调用有返回值的前缀带get的正常带有驼峰的方法,并将返回值和get方法的get后面部分内容,当作一个参数放入json中

如果使用的不好的话,会出现更加严重的问题
尝试在方法中加入getXiaoMing()方法,返回对象User:


public class User {

    public String name;

    public void setName(String name){
        this.name = name;
    }

    public User getXiaoMing(){
        User xiaoMing = new User();
        xiaoMing.setName("小明");
        return xiaoMing;
    }

    public static void main(String[] args) {
        User user = new User();
        user.setName("夏洛特");
        String json = JSONObject.toJSONString(user);
        System.err.println(json);
    }

}

再跑一下
直接报:Exception in thread “main” java.lang.StackOverflowError
栈溢出
原因是fastjson会调用对象中的get开头的方法,然后该方法中返回了一个User对象,他去解析User对象的时候又会去调用里面的getXiaoMing方法,就等于是一直的递归下去,导致栈溢出.

如果你的get方法和你对象中的变量名称是一样的fastjson会进行一次去重,所以在对象中定义方法名称的时候注意如果不是获取对象的变量,最好不要使用get开头.

有兴趣的同学也可以复制代码试一下

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值