javabean与json转换(fastjson与jackson两个版本)

【README】

本文演示了 javabean与json转换的开发方式;

要想 javabean的属性名 与 json的字段名不一致,也是可以转换的;

之前需要引入 ali.fastjson

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.78</version>
        </dependency>

【1】javabean与fastjson互转

对于 perons, 需求是属性id 转换为 json字符串后,其字段名为 myid;

public class FastPerson {
    @JSONField(name="myid") // bean属性id的别名为myid
    private int id;
    @JSONField(name="name")
    private String name;
    @JSONField(serialize = false) // bean的city属性不转为json字符串
    private String city;
    @JSONField(deserialize = false) // json字符串的addr字段不解析到bean的addr属性
    private String addr;
    // 不进行序列化与反序列化(transient对 fastjson有效)
    private transient String dontTrans;

    public void setId(int id) {
        this.id = id;
    }

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

    public void setCity(String city) {
        this.city = city;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getCity() {
        return city;
    }

    public String getAddr() {
        return addr;
    }

    public String getDontTrans() {
        return dontTrans;
    }

    public void setDontTrans(String dontTrans) {
        this.dontTrans = dontTrans;
    }

    @Override
    public String toString() {
        return "FastPerson{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", city='" + city + '\'' +
                ", addr='" + addr + '\'' +
                ", dontTrans1='" + dontTrans + '\'' +
                '}';
    }
}

转换测试用例;

public class FastJsonDemo {
    public static void main(String[] args) {
        FastPerson person2 = new FastPerson();
        person2.setId(1);
        person2.setName("zhangsan");
        person2.setAddr("gaoxinqu");
        person2.setCity("cd");
        person2.setDontTrans("dont");

        // bean 转json字符串
        String jsonstr2 = JSON.toJSONString(person2);
        System.out.println(jsonstr2);
        // json字符串转bean
        FastPerson p2 = JSON.parseObject(jsonstr2, FastPerson.class);
        System.out.println(p2);
    }
}

打印结果;

{"addr":"gaoxinqu","myid":1,"name":"zhangsan"}
Person2{id=1, name='zhangsan', city='null', addr='null', dontTrans1='null'}

【补充】

  • @JSONField(name="myid") 注解用于定义javabean属性的别名,即转为json字符串之后的字段名;
  • @JSONField(serialize = false)   bean的city属性不转为json字符串(不进行序列化)
  • @JSONField(deserialize = false)  json字符串的addr字段不解析到bean的addr属性(不进行反序列化)
  • transient 用于表示该字段不进行序列化与反序列化; 
  • 需要转换json的bean,必须要有 getter 和 setter 方法

【2】javabean与jackson互转

添加maven依赖;

<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.5</version>
        </dependency>

jackson测试的javabean; 

public class JacksonPerson {
    @JsonProperty("myid") // bean属性id的别名为myid
    private int id;
    @JsonProperty("name")
    private String name;
    @JsonIgnore // bean的city属性不转为json字符串
    private String city;
    @JsonIgnore // json字符串的addr字段不解析到bean的addr属性
    private String addr;
    // transient 对 jackson 无效, 即jackson还是会序列化与反序列化 dontTrans 属性
    private transient String dontTrans;

    public void setId(int id) {
        this.id = id;
    }

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

    public void setCity(String city) {
        this.city = city;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getCity() {
        return city;
    }

    public String getAddr() {
        return addr;
    }

    public String getDontTrans() {
        return dontTrans;
    }

    public void setDontTrans(String dontTrans) {
        this.dontTrans = dontTrans;
    }

    @Override
    public String toString() {
        return "JacksonPerson{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", city='" + city + '\'' +
                ", addr='" + addr + '\'' +
                ", dontTrans1='" + dontTrans + '\'' +
                '}';
    }
}

jackson测试用例:

public class JacksonDemo {
    public static void main(String[] args) {
        JacksonPerson jacksonPerson = new JacksonPerson();
        jacksonPerson.setId(1);
        jacksonPerson.setName("zhangsan");
        jacksonPerson.setAddr("gaoxinqu");
        jacksonPerson.setCity("cd");
        jacksonPerson.setDontTrans("dont");

        // bean 转json字符串
        String jacksonStr = JacksonUtils.beanToJson(jacksonPerson);
        System.out.println(jacksonStr);
        // json字符串转bean
        JacksonPerson p2 = JacksonUtils.jsonToBean(jacksonStr, JacksonPerson.class);
        System.out.println(p2);
    }
}

// jackson 工具
public class JacksonUtils {
    private JacksonUtils(){
    }
    private static ObjectMapper objectMapper;
    static {
        objectMapper = new ObjectMapper();
    }

    //bean转换为json字符串
    public static String beanToJson(Object bean) {
        String jsonStr = "";
        try {
            jsonStr = objectMapper.writeValueAsString(bean);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return jsonStr;
    }

    //map转换为json字符串
    public static String mapToJson(Map<String, Object> map) {
        String jsonStr = "";
        try {
            jsonStr = objectMapper.writeValueAsString(map);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return jsonStr;
    }

    //list转换为json字符串
    public static String listToJson(List<Object> list) {
        String jsonStr = "";
        try {
            jsonStr = objectMapper.writeValueAsString(list);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return jsonStr;
    }

    //json字符串转换为bean
    public static <T> T jsonToBean(String jsonStr, Class<T> clazz) {
        T bean = null;
        try {
            bean = objectMapper.readValue(jsonStr, clazz);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bean;
    }

    //json字符串转换为list
    public static <T> List<T> jsonToList(String jsonStr, Class<T> clazz) {
        List list = null;
        try {
            list = (List) objectMapper.readValue(jsonStr, clazz);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }

    //json字符串转换为map
    public static Map jsonToMap(String jsonStr, Class<?> clazz) {
        Map map = null;
        try {
            map = (Map) objectMapper.readValue(jsonStr, clazz);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return map;
    }
}

打印结果:

{"dontTrans":"dont","myid":1,"name":"zhangsan"}
JacksonPerson{id=1, name='zhangsan', city='null', addr='null', dontTrans1='dont'}

显然, transient 对 jackson 无效,即  即jackson还是会序列化与反序列化 dontTrans 属性;


【2】fastjson 与 jackson 区别

【2.1】fastjson

是阿里的开源框架,被不少企业使用,是一个极其优秀的Json框架; 字符串解析成JavaBean时,当数据量较少时首选fastjson;字符串解析成JSON时,当数据量较少时首选fastjson

例子:

//将对象或List转为json字符串或json数组
JSON.toJSONString(obj);
//将json字符串和json数组转为对象或list
JSON.toJSON(jsonStr)

【2.2】jackson

是基于Java平台的一套数据处理工具,被称为“最好的Java Json解析器”;字符串解析成JavaBean时,数据量较大使用jackson;字符串解析成JSON时,数据量较大使用jackson

//首先要先定义一个Mapper
ObjectMapper mapper = new ObjectMapper();
//将对象或List转为json字符串或json数组
mapper.writeValueAsString(obj);
//将json字符串和json数组转为对象或list
mapper.readValue(jsonStr, Class);

补充: 数据量是多少算较少,算较大 ?

本文仅给出一个经验值 100w,但具体要在本地做性能测试才可以计算出来;

补充:两者性能测试 refer2

[享学Jackson] 二十二、Jackson与Fastjson的恩怨情仇(完结篇)【附源码】_YourBatman_51CTO博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值