FastJSON解析-----@JSONField注解详解

为什么今天要提到FastJson注解的这个属性,我说一下一个场合大家就明白了,你将一个功能开发完毕以后,数据适配完毕,但是后台人员忽然告诉你,后台的返回报文字段名字要做修改,你如果没有遇到这个属性之前,心中千万句草拟马略过,因为要重新去屑bean对象,重新系列,重新获取;但是遇到这个以后,心中不愿意,但是微微一下,点点头告诉他;可以

序列化和反序列化

众所周知,类的对象会随着程序的终止而被垃圾收集器销毁。如果要在不重新创建对象的情况下调用该类,该怎么做?这就可以通过序列化将数据转换为字节流。

  • 序列化
    对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存了Java对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。
  • 反序列化
    客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。
    本质上讲,序列化就是把实体对象状态按照一定的格式写入到有序字节流,反序列化就是从有序字节流重建对象,恢复对象状态。
package com.java;

import java.io.Serializable;

import java.util.ArrayList;

import java.util.List;

/**
 * 序列化对象
 * @author -zhengzx-
 *
 */
public class Player implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = -5248069984631225347L;
    public Player(long playerId,  int age, String name) {

        this.playerId = playerId;

        this.age = age;

        this.name = name;

    }

    private long playerId;
    private int age;

    private String name;
    private List<Integer> skills = new ArrayList<>();
    public long getPlayerId() {
        return playerId;
    }
    public void setPlayerId(long playerId) {
        this.playerId = playerId;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public List<Integer> getSkills() {
        return skills;
    }

    public void setSkills(List<Integer> skills) {

        this.skills = skills;
    }

}

【1】:对象序列化代码如下,具体细节注释说明:Java中通过对象流 ObjectOutputStream 进行序列化。
【2】:反序列化为对象,具体细节注释说明:Java中通过对象流 ObjectInputStream 进行序列化。


package com.java;

 

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.util.Arrays;

 

/**

 * Description:序列化与反序列化

 * @author zhengzx

 */

public class JavaSerialize {

    public static void main(String[] args) throws Exception {

        Player player = new Player(10001, 21, "teacher");

        player.getSkills().add(10001);

        //序列化

        byte[] bytes = toBytes(player);

        //反序列化

        toPlay(bytes);

    }

    /**  

     * Title: toBytes  

     * Description:序列化对象  

     * @author zhengzx  

     * @throws Exception 

     */  

    public static byte[] toBytes(Object out) throws Exception {

        //用于序列化后存储对象

        ByteArrayOutputStream byteArrayOutputStream = null;

        //java序列化API

        ObjectOutputStream objectOutputStream = null;

        try {

            byteArrayOutputStream = new ByteArrayOutputStream();

            objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);

            //将out对象进行序列化

            objectOutputStream.writeObject(out);

            //测试验证输入(获取字节数组)

            byte[] bs = byteArrayOutputStream.toByteArray();

            //将数组转化为字符串输入

            System.out.println(Arrays.toString(bs));

            return bs;

            

        } catch (IOException e) {

            e.printStackTrace();

        }finally {

            //关闭最外层的流(内部流会自动关闭)

            objectOutputStream.close();

        }

        return null;

    }

    

    /*

     * Title: toPlay  

     * Description:反序列化对象  

     * @author zhengzx  

     * @throws Exception 

     */

    public static void toPlay(byte[] bs) throws Exception {

        //创建存放二进制数据的API

        ByteArrayInputStream byteArrayInputStream = null;

        //创建反序列化对象

        ObjectInputStream objectInputStream = null;

        try {

            byteArrayInputStream = new ByteArrayInputStream(bs);

            objectInputStream = new ObjectInputStream(byteArrayInputStream);

            //校验测试

            Player player = (Player) objectInputStream.readObject();

            System.out.println(player.toString());

        } catch (IOException e) {

            e.printStackTrace();

        }finally {

            objectInputStream.close();

        }

    }

}

输出结果


image.png

fastjson编程式如何使用以及痛点

一般最常见的是这两个方法:
JSON.toJSONString(object):序列化对象,生产字符串
JSON.parse(text):反序列化对象,字符串转json

几个属性
  • name
  • format,
  • serialize
  • deserialize
  • serializeUsing,
  • deserializeUsing
public class TestBean  {

    /**
     * result : 000000
     * message : 请求成功!
     * data : [{"id_number":"61042319","if_select":"0","names":"王引"},{"id_number":"1307309337","if_select":"0","names":"张灵狐"},{"id_number":"610404201109216027","if_select":"0","names":"华怡涵"},{"id_number":"370213194506033833","if_select":"0","names":"哈士奇"},{"id_number":"610404201504165039","if_select":"0","names":"杜锦尚"},{"id_number":"610121197005181908","if_select":"0","names":"齐军平"},{"id_number":"610402198511287002","if_select":"户籍地址不在服务包发布范围,不能进行签约!","names":"赵纳"},{"id_number":"610404197010155544","if_select":"户籍地址不在服务包发布范围,不能进行签约!","names":"姚爱玲"},{"id_number":"61040419941123551X","if_select":"户籍地址不在服务包发布范围,不能进行签约!","names":"郭路裕"},{"id_number":"61040419490705551X","if_select":"户籍地址不在服务包发布范围,不能进行签约!","names":"王建业"},{"id_number":"610402197504306100","if_select":"户籍地址不在服务包发布范围,不能进行签约!","names":"曹锋利"},{"id_number":"610404195506205526","if_select":"户籍地址不在服务包发布范围,不能进行签约!","names":"边淑会"},{"id_number":"610404200402015019","if_select":"户籍地址不在服务包发布范围,不能进行签约!","names":"杜尚"},{"id_number":"610121194201041570","if_select":"户籍地址不在服务包发布范围,不能进行签约!","names":"曹志政"},{"id_number":"610404200710135522","if_select":"户籍地址不在服务包发布范围,不能进行签约!","names":"郭栩彤"},{"id_number":"61040419720408553X","if_select":"户籍地址不在服务包发布范围,不能进行签约!","names":"郭群利"},{"id_number":"610404194611085525","if_select":"户籍地址不在服务包发布范围,不能进行签约!","names":"司淑云"},{"id_number":"610404197604195017","if_select":"已加入购物车,不能重复操作!","names":"杜龙"}]
     */

    private String result;
    private String message;
    private List<DataBean> data;

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public static class DataBean {
        /**
         * id_number : 61042319871110302X
         * if_select : 0
         * names : 王引
         */

        private String id_number;
        private String if_select;
        private String names;

        public String getId_number() {
            return id_number;
        }

        public void setId_number(String id_number) {
            this.id_number = id_number;
        }

        public String getIf_select() {
            return if_select;
        }

        public void setIf_select(String if_select) {
            this.if_select = if_select;
        }

        public String getNames() {
            return names;
        }

        public void setNames(String names) {
            this.names = names;
        }
    }
}}

测试:

这样去写只是证明了序列化成功了:

public class Main2Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        String json = "{\n" +
                "    \"data\": [\n" +
                "        {\n" +
                "            \"id_number\": \"61042319\",\n" +
                "            \"if_select\": \"0\",\n" +
                "            \"names\": \"王引\"\n" +
                "        },\n" +
                "        {\n" +
                "            \"id_number\": \"1307309337\",\n" +
                "            \"if_select\": \"0\",\n" +
                "            \"names\": \"张灵狐\"\n" +
                "        }\n" +
                "    ],\n" +
                "    \"message\": \"请求成功!\",\n" +
                "    \"result\": \"000000\"\n" +
                "}";
        TestBean testBean = JSON.parseObject(json, TestBean.class);
        Log.e("string",JSON.toJSONString(testBean));


    }
}

输出,证明了我们序列化成功了

image.png

假设现在我们后台的报文将"id_number"返回值变为"number";我们来看输出结果


image.png

输出报Json的异常,那么我们这种情况下应该使用name这个属性了

image.png

打印结果,报文正常输出,显示后台最新的报文


image.png

如果我还想将name放到前面形成{"names":"张灵狐","number":"1307309337"}这样呢?如下即可,ordinal是用来排序的.

image.png

我们配置了names为0,number为1,来一起看输出顺序,前后两次的顺序就很明显

image.png

如果我在序列化的时候想过滤掉name这个字段怎么做呢?使用serialize即可

image.png

输出结果,前后对比,names不见了

image.png
如果我在反序列化的时候想过滤掉呢?如下:

@JSONField(deserialize = false)

如果我在序列化的时候想输出日期格式怎么办?如下:

@JSONField(format = "yyyy-MM-dd")

如果我想在生成json或者解析json时获得的对象名字前面都加上"大爷怎么办"呢?这就需要具体的定制了.下面是解析和生成结合到了一起


deserializeUsing //自定反序列化类,必须是静态类。实现ObjectDeserializer接口,不是静态类的话我测试了会错误

image.png

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容