Java对象的序列化与反序列化-Json篇

说到Java对象的序列化与反序列化,我们首先想到的应该是Java的Serializable接口,这玩意在两个系统之间的DTO对象里面可能会用到,用于系统之间的数据传输。或者在RPC(远程方法调用)时可能会用到。

但其实若是用于数据传输,xml和json两种数据格式用得更多一些。但是为什么不用XStream呢,XStream确实好用,但是在Applet环境下可以使用的xml类库也就只有jdom了,连dom4j在Applet环境下都没有权限使用(Java反射的某些特性是需要权限的,Applet的安全机制不允许)。

扯远了,本文要说的是Java对象与Json的相互转换。目前Java常用的Json类库有3种,即fastjson、jackson和gson,分别介绍如何将一个Java对象转换成Json和将一个Json字符串转换成Java对象,其实它们的用法大同小异。

一、首先看Maven依赖
二、需要序列化的POJO和初始化代码
三、fastjson的使用
四、jackson的使用
五、gson的使用

一、首先看Maven依赖

若不会maven,请参考Maven的基本用法:http://jisonami.iteye.com/blog/2300036

 <!-- json -->  
 <!-- 引入fastjson依赖 -->  
<dependency>  
     <groupId>com.alibaba</groupId>  
    <artifactId>fastjson</artifactId>  
    <version>1.2.12</version>  
 </dependency>  

二、需要序列化的POJO和初始化代码

package test;

public class User {
    private int id;
    private String phone;

    public int getId(){
        return id;
    }

    public String getPhone(){
        return phone;
    }

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

    public void setPhone(String phone){
        this.phone = phone;
    }
}
package test;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Person implements Serializable {
     /**
      * 序列化ID
      */
     private static final long serialVersionUID = -5809782578272943999L;
    private String name;
    private int age;
    private List<User> users = new ArrayList<User>();
    //该属性为不可序列化的,所以声明为短暂的
    public transient int ssn;

    public String getName(){
        return name;
    }

    public int getAge(){
        return age;
    }

    public int getSsn(){
        return ssn;
    }

    public List<User> getUsers(){
        return users;
    }
    public void setName(String name){
        this.name = name;
    }

    public void setAge(int age){
        this.age = age;
    }

    public void setSsn(int ssn){
        this.ssn = ssn;
    }

    public void setUsers( List<User> users){
        this.users.addAll(users);
    }
}

三、fastjson的使用
fastjson的主要工具类是JSON,以下代码实现Java对象的序列化与反序列化

package test;



import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Reporter;
import org.testng.annotations.Test;

import java.io.*;
import java.util.ArrayList;
import java.util.List;


public class Case3 {

        @Test
        public void case3(){
            User user1 = new User();
            user1.setId(1);
            user1.setPhone("15050276350");

            User user2 = new User();
            user2.setId(2);
            user2.setPhone("15050276351");

            List<User> userList = new ArrayList<>();
            userList.add(user1);
            userList.add(user2);

            Person person = new Person();
            person.setName("张三");
            person.setAge(18);

//            person.getUsers().add(user1);
//            person.getUsers().add(user2);

            person.setUsers(userList);
            //将Java对象序列化为Json字符串
            String jsonString = JSON.toJSONString(person);
            System.out.println("jsonString:" + jsonString);

            //将Json字符串序列化为JSON对象
            JSONObject person1 = JSON.parseObject(jsonString);
            System.out.println("person1:" + person1);

            //将Json字符串反序列化为java对象
            Person person2 =JSON.parseObject(jsonString,Person.class);
            System.out.println("person2:" + person2);
        }
}

转自:https://www.cnblogs.com/UniqueColor/p/8358377.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值