架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 14378|回复: 1

[资料] Fastjson JSONField 反序列化无效解决方案

[复制链接]
发表于 2019-1-11 10:51:31 | 显示全部楼层 |阅读模式
用了阿里巴巴的Fastjson来做序列化和反序列化对象,由于我的原来json字符串都是用a、b、c...这样的字母来表示的,但是我序列化成对象,不能把对象定义成这种无意义的属性了。
这里用到了JSONField注解。

@JSONField放在字段上和get set方法上的区别

  • 放在字段上, 同时指定序列化和反序列化操作
  • 放在get上, 指定序列化时的操作
  • 放在set上, 指定反序列化时的操作



我使用后,能正常序列化,但是不能正常反序列化,如下图:

QQ截图20190111103945.jpg
json字符串:

{"a":"shenzhou","b":"京Q7UB02","c":110000,"d":"2019-01-08T17:07:04+08:00","e":120.775085,"f":30.13825,"g":77,"h":171,"i":0,"j":4951,"k":2,"l":0,"m":0,"n":4,"o":"0","p":1}


错误原因:

对象的属性没有遵循Java的驼峰命名法,除第一个单词之外,其他单词首字母大写。譬如

int myStudentCount;
变量myStudentCount第一个单词是全部小写,后面的单词首字母大写。

解决方案:

修改对象属性命名,重新生成get/set方法,代码如下:

  1. package com.itsvse.es.models;

  2. import com.alibaba.fastjson.JSONObject;
  3. import com.alibaba.fastjson.annotation.JSONField;

  4. import java.util.Date;

  5. public class PositionVehicle {

  6.     @Override

  7.     public String toString() {

  8.         return JSONObject.toJSONString(this);

  9.     }
  10.     @JSONField(name = "a")
  11.     private String name;

  12.     public String getName() {
  13.         return name;
  14.     }

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

  18.     @JSONField(name = "b")
  19.     private String testId;

  20.     public String getTestId() {
  21.         return testId;
  22.     }

  23.     public void setTestId(String testId) {
  24.         this.testId = testId;
  25.     }
  26.     /// <summary>
  27.     /// 公司标识
  28.     /// </summary>
  29. //    @JSONField(name = "a")
  30. //    private String CompanyId;

  31.     /// <summary>
  32.     /// 车辆号牌
  33.     /// </summary>
  34.     @JSONField(name = "zz")
  35.     private String VehicleNo;

  36.     /// <summary>
  37.     /// 行政区划代码
  38.     /// </summary>
  39.     @JSONField(name = "c")
  40.     private Integer VehicleRegionCode;

  41.     /// <summary>
  42.     /// 定位时间
  43.     /// </summary>
  44.     @JSONField(name = "d")
  45.     private Date PositionTime;

  46.     /// <summary>
  47.     /// 经度
  48.     /// </summary>
  49.     @JSONField(name = "e")
  50.     private double Longitude;

  51.     /// <summary>
  52.     /// 纬度
  53.     /// </summary>
  54.     @JSONField(name = "f")
  55.     private double Latitude;

  56.     /// <summary>
  57.     /// 瞬时速度
  58.     /// </summary>
  59.     @JSONField(name = "g")
  60.     private Integer Speed;

  61.     /// <summary>
  62.     /// 方向角
  63.     /// </summary>
  64.     @JSONField(name = "h")
  65.     private Integer Direction;

  66.     /// <summary>
  67.     /// 海拔高度
  68.     /// </summary>
  69.     @JSONField(name = "i")
  70.     private Integer Elevation;

  71.     /// <summary>
  72.     /// 行驶里程
  73.     /// </summary>
  74.     @JSONField(name = "j")
  75.     private Integer Mileage;

  76.     /// <summary>
  77.     /// 坐标加密标识
  78.     /// </summary>
  79.     @JSONField(name = "k")
  80.     private Integer Encrypt;

  81.     /// <summary>
  82.     /// 预警状态
  83.     /// </summary>
  84.     @JSONField(name = "l")
  85.     private Integer WarnStatus;

  86.     /// <summary>
  87.     /// 车辆状态
  88.     /// </summary>
  89.     @JSONField(name = "m")
  90.     private Integer VehStatus;

  91.     /// <summary>
  92.     /// 营运状态
  93.     /// </summary>
  94.     @JSONField(name = "n")
  95.     private Integer BizStatus;

  96.     /// <summary>
  97.     /// 订单编号
  98.     /// </summary>
  99.     @JSONField(name = "o")
  100.     private String OrderId;

  101.     /// <summary>
  102.     /// 车辆类型
  103.     /// </summary>
  104.     @JSONField(name = "p")
  105.     private Integer CommercialType;

  106. //    public String getCompanyId() {
  107. //        return CompanyId;
  108. //    }
  109. //
  110. //    public void setCompanyId(String companyId) {
  111. //        CompanyId = companyId;
  112. //    }

  113.     public String getVehicleNo() {
  114.         return VehicleNo;
  115.     }

  116.     public void setVehicleNo(String vehicleNo) {
  117.         VehicleNo = vehicleNo;
  118.     }

  119.     public Integer getVehicleRegionCode() {
  120.         return VehicleRegionCode;
  121.     }

  122.     public void setVehicleRegionCode(Integer vehicleRegionCode) {
  123.         VehicleRegionCode = vehicleRegionCode;
  124.     }

  125.     public Date getPositionTime() {
  126.         return PositionTime;
  127.     }

  128.     public void setPositionTime(Date positionTime) {
  129.         PositionTime = positionTime;
  130.     }

  131.     public double getLongitude() {
  132.         return Longitude;
  133.     }

  134.     public void setLongitude(double longitude) {
  135.         Longitude = longitude;
  136.     }

  137.     public double getLatitude() {
  138.         return Latitude;
  139.     }

  140.     public void setLatitude(double latitude) {
  141.         Latitude = latitude;
  142.     }

  143.     public Integer getSpeed() {
  144.         return Speed;
  145.     }

  146.     public void setSpeed(Integer speed) {
  147.         Speed = speed;
  148.     }

  149.     public Integer getDirection() {
  150.         return Direction;
  151.     }

  152.     public void setDirection(Integer direction) {
  153.         Direction = direction;
  154.     }

  155.     public Integer getElevation() {
  156.         return Elevation;
  157.     }

  158.     public void setElevation(Integer elevation) {
  159.         Elevation = elevation;
  160.     }

  161.     public Integer getMileage() {
  162.         return Mileage;
  163.     }

  164.     public void setMileage(Integer mileage) {
  165.         Mileage = mileage;
  166.     }

  167.     public Integer getEncrypt() {
  168.         return Encrypt;
  169.     }

  170.     public void setEncrypt(Integer encrypt) {
  171.         Encrypt = encrypt;
  172.     }

  173.     public Integer getWarnStatus() {
  174.         return WarnStatus;
  175.     }

  176.     public void setWarnStatus(Integer warnStatus) {
  177.         WarnStatus = warnStatus;
  178.     }

  179.     public Integer getVehStatus() {
  180.         return VehStatus;
  181.     }

  182.     public void setVehStatus(Integer vehStatus) {
  183.         VehStatus = vehStatus;
  184.     }

  185.     public Integer getBizStatus() {
  186.         return BizStatus;
  187.     }

  188.     public void setBizStatus(Integer bizStatus) {
  189.         BizStatus = bizStatus;
  190.     }

  191.     public String getOrderId() {
  192.         return OrderId;
  193.     }

  194.     public void setOrderId(String orderId) {
  195.         OrderId = orderId;
  196.     }

  197.     public Integer getCommercialType() {
  198.         return CommercialType;
  199.     }

  200.     public void setCommercialType(Integer commercialType) {
  201.         CommercialType = commercialType;
  202.     }
  203. }
复制代码
对于正确的属性,反序列化成功,如下图:

QQ截图20190111103811.jpg





上一篇:职场类电子书
下一篇:【中华经典藏书系列】PFD格式还参杂了一些其他的书
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2019-1-14 16:29:58 | 显示全部楼层
已经放弃fastjson,转用jackson,碰到阿里系的开源,如果不是优势天差地别,绕道别碰。
用法如下:

pop.xml

  1. <!--json序列化类库-->
  2.         <dependency>
  3.             <groupId>com.fasterxml.jackson.core</groupId>
  4.             <artifactId>jackson-databind</artifactId>
  5.             <version>2.9.8</version>
  6.         </dependency>
复制代码


JAVA对象转JSON[JSON序列化]

  1. import java.io.IOException;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import com.fasterxml.jackson.databind.ObjectMapper;

  7. public class JacksonDemo {
  8.     public static void main(String[] args) throws ParseException, IOException {
  9.         User user = new User();
  10.         user.setName("zhangsan");
  11.         user.setEmail("zhangsan@163.com");
  12.         user.setAge(20);

  13.         SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
  14.         user.setBirthday(dateformat.parse("1996-10-01"));

  15.         /**
  16.          * ObjectMapper是JSON操作的核心,Jackson的所有JSON操作都是在ObjectMapper中实现。
  17.          * ObjectMapper有多个JSON序列化的方法,可以把JSON字符串保存File、OutputStream等不同的介质中。
  18.          * writeValue(File arg0, Object arg1)把arg1转成json序列,并保存到arg0文件中。
  19.          * writeValue(OutputStream arg0, Object arg1)把arg1转成json序列,并保存到arg0输出流中。
  20.          * writeValueAsBytes(Object arg0)把arg0转成json序列,并把结果输出成字节数组。
  21.          * writeValueAsString(Object arg0)把arg0转成json序列,并把结果输出成字符串。
  22.          */
  23.         ObjectMapper mapper = new ObjectMapper();

  24.         //User类转JSON
  25.         //输出结果:{"name":"zhangsan","age":20,"birthday":844099200000,"email":"zhangsan@163.com"}
  26.         String json = mapper.writeValueAsString(user);
  27.         System.out.println(json);

  28.         //Java集合转JSON
  29.         //输出结果:[{"name":"zhangsan","age":20,"birthday":844099200000,"email":"zhangsan@163.com"}]
  30.         List<User> users = new ArrayList<User>();
  31.         users.add(user);
  32.         String jsonlist = mapper.writeValueAsString(users);
  33.         System.out.println(jsonlist);
  34.     }
  35. }
复制代码


JSON转Java类[JSON反序列化]

  1. public class JacksonDemo {
  2.     public static void main(String[] args) throws ParseException, IOException {
  3.         String json = "{"name":"zhangsan","age":20,"birthday":844099200000,"email":"zhangsan@163.com"}";
  4.         /**
  5.          * ObjectMapper支持从byte[]、File、InputStream、字符串等数据的JSON反序列化。
  6.          */
  7.         ObjectMapper mapper = new ObjectMapper();
  8.         User user = mapper.readValue(json, User.class);
  9.         System.out.println(user);
  10.     }
  11. }
复制代码


码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-12-15 04:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表