前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Jsonfield注解的使用

Jsonfield注解的使用

作者头像
呼延十
发布2019-07-01 16:28:09
3.5K0
发布2019-07-01 16:28:09
举报
文章被收录于专栏:呼延

PS:此文没有原理解读,仅有使用工具解决办法。

日前在工作中,遇到了一个问题,关于java的序列化。

工作中与前端的数据交换使用的协议是json+protobuf,主要是用protobuf。

现在我需要接收一份较为复杂的数据,数据格式如下:

代码语言:javascript
复制
      {
        "result": [
          {
            "String": "string",
            "Int": 123,
            "persions": [
              {
                "person_name": "huyan",
                "person_name_2": "shi"
              }
            ],
            "money": [
              {
                "type": "dollar",
                "num": 100
              }
            ]
          },
          {
            "String": "str",
            "Int": 123,
            "persions": [],
            "money": [
              {
                "type": "软妹币",
                "num": 100
              }
            ]
          }
        ]
      }

result里面是一个类的列表,我一开始将其定义为proto(这里要尤其注意,这个数据暂不牵涉到数据交换,单纯是懒,定义proto顺手就定义了),然后在拿到result数组之后,需要将其转化为Java POJO列表。

由JSONArray转化为对象列表,哎?? fastJson有现成的呀,直接使用:

代码语言:javascript
复制
  public static <T> List<T> parseArray(String text, Class<T> clazz)

方法走你!

后来发现不行,json转java对象使用的是对象的get和set方法,而proto并没有提供传统的get和set方法,提供的是基于builder的set方法,即:set方法的返回值不是void,而是builder。

重点来了,重点来了:

我选择了自己实现,即:遍历JSONArray,逐个取值,新建对象,存值。

不要问我为什么,懒!懒得改了。

等我功能完全实现之后,打算review一下自己的代码,重构一下,因为这个需求做了好久,我都忘记自己写的啥玩意了。

看到了这块代码,MMP啊,这代码别说老大给不给过,我自己就过不了啊!!!

然后把这几个类的定义从proto改到普通的POJO,然后提取共性,一番折腾下来重新使用fastjson序列化,成功了,但是好多值莫名其妙的为空。尤其是其中的对象,person基本都是空。

这个时候我甚至怀疑了一下是不是fastjson不支持这么复杂的数据转化,比如类里面有几个类的列表。

(!!对不起,马爸爸我不该怀疑你的,对不起我知道我狂妄了,我这数据复杂个屁啊)。

在冲动过后,我觉得fastjson不可能这么菜的,怀疑到是不是自己出错了,比如:属性名称不一样。。

检查了一下,是的,,但是呢我的命名问题不大,而且业务都写好了不想改,这时候就用到@JSONField注解了。

在每个名字不一样的属性上打上注解,注解里面备注名字,妥了!

@JSONField

此注解可以使用在属性上和get/set方法上,具体效果为:

代码语言:javascript
复制
@JSONField(name="Age")
private int age;

@JSONField(name="Age")
private int getAge(){
  return this.age;
}

@JSONField(name="Age")
private void setAge(int age){
  this.age = age;
}

注解在属性上,序列化以及反序列化都会使用此名字,通俗点就是:会把json里面key为“Age”的值赋值给 该类的age,会把age的值写入“Age”。

注解在get/set上就是上述操作的一半,一个控制序列化,一个控制反序列化。

ChangeLog

2018-09-28 完成 2018-09-29 bug fix

以上皆为个人所思所得,如有错误欢迎评论区指正。

欢迎转载,烦请署名并保留原文链接。

联系邮箱:huyanshi2580@gmail.com


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • @JSONField
    • ChangeLog
    相关产品与服务
    文件存储
    文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档