JSONField解决序列化与反序列化字段匹配问题
需求:调用第三方数据,数据格式为Json,并提供一个接口将获取的第三方数据给本公司其他部门调用。
处理流程:第三方Json--反序列化实体--保存到本地数据库--查询数据--序列化Json数据供本公司调用。简化为:json--实体--json。
遇到问题:
1,把数据存到本地后,怎么取数据,各层级之间怎么关联?
2,json--实体,反序列化,有的实体中数据为null,未能解析到json数据?
3,实体--json,序列化,有的实体中的字段(比如:解决问题1时,增加的字段id,recordId)不需要序列化Json数据,即不需要展示给用户,如何不序列化?
解决方法:
1,创建表结构时,增加两个字段,id,recordId,id为每一层的主键,recordId为关联字段,用外层的id,对应里层recordId,让每一层建立关联关系,实现查询。
2,原因:Json数据中key与实体中定义字段不匹配。
看一下:json数据中key用下划线分割,而实体中定义变量时,形式为驼峰格式,这时可以正常解析,实体中对应属性有值。
而Json中标红的数据,用点分割(注意实体中不能直接定义用点分割的变量。),无法反序列化到实体。
解决方案一:注解加到变量上,用@JSONField(name = " "),对应json中key。
解决方案二:注解加到方法上,把该注解@JSONField(name = " "),加到set/get方法上,关键是加到set还是get方法上?结论是加到set方法上,可以理解为给实体中变量赋值,name值与json中key对应。
什么情况下:注解加到get方法上,实体序列化时,默认情况下,实体--json,json中key为实体中对应变量。如果想要别人调用接口获取的json,与第三方保持一致,即有下划线,可以通过在get方法上加注解,转化想要的json数据格式。
事例:
实体定义:
public class InputParametersSYS extends BasePojo { private BigDecimal recordId; private String partnerCode; private String idNumber; private String accountName; private String accountMobile; @JSONField(name = "mobile.name.id")
private String mobileNameId;
Json数据:
"interfaces": [
{
"details": [
{
"result": {
"result": 0,
"success": true,
"display": "一致"
},
"input_parameters": {
"id_number": "370404199006301915",
"mobile.name.id": "mobile.name.id",
"account_name": "皮晴晴",
"account_mobile": "13333333333",
"partner_code": "pinganhq"
}
}
],
"type": "手机号三要素核验"
},
3,
方案一:在对应的不需要显示的字段上加注解@JSONFiled(serialize = false)
//@JsonIgnore
@JSONField(serialize = false)
private Integer id;
方案二:加@JsonIgnore注解。不过当id,recordId 定义为int类型时,该注解不起作用。定义为Integet类型时,该注解生效。
1. JSONField 介绍(转载)
package com.alibaba.fastjson.annotation;
public @interface JSONField {
// 配置序列化和反序列化的顺序,1.1.42版本之后才支持
int ordinal() default 0;
// 指定字段的名称
String name() default "";
// 指定字段的格式,对日期格式有用
String format() default "";
// 是否序列化
boolean serialize() default true;
// 是否反序列化
boolean deserialize() default true;
}
2. JSONField配置方式
FieldInfo可以配置在getter/setter方法或者字段上。例如:
2.1 配置在getter/setter上
public class A {
private int id;
@JSONField(name="ID")
public int getId() {return id;}
@JSONField(name="ID")
public void setId(int value) {this.id = id;}
}
2.2 配置在field上
public class A {
@JSONField(name="ID")
private int id;
public int getId() {return id;}
public void setId(int value) {this.id = id;}
}
3. 使用format配置日期格式化
public class A {
// 配置date序列化和反序列使用yyyyMMdd日期格式
@JSONField(format="yyyyMMdd")
public Date date;
}
4. 使用serialize/deserialize指定字段不序列化
public class A {
@JSONField(serialize=false)
public Date date;
}
5. 使用ordinal指定字段的顺序
缺省fastjson序列化一个java bean,是根据fieldName的字母序进行序列化的,你可以通过ordinal指定字段的顺序。这个特性需要1.1.42以上版本。
public static class VO {
@JSONField(ordinal = 3)
private int f0;
@JSONField(ordinal = 2)
private int f1;
@JSONField(ordinal = 1)
private int f2;
}
JSONField解决序列化与反序列化字段匹配问题的更多相关文章
- DRF框架(三)——media资源路径设置、多表设计复习及补充、序列化组件(ModelSerializer)操作多表(序列化与反序列化)、多表序列化与反序列化整合(重点)
media资源路径设置 (设置好后把图片放在这个文件夹中,通过链接能访问到图片) 1.先在根目录设置一个media文件夹 2.配置settings.py,加上下面的 MEDIA_URL = '/me ...
- ModelSerializer,序列化与反序列化整合
复习 """ 1.解析模块:全局局部配置 REST_FRAMEWORK = { # 全局解析类配置 'DEFAULT_PARSER_CLASSES': [ 'rest_f ...
- 第十八天python3 序列化和反序列化
思考: 内存中的字典.列表.集合以及各种对象,如何保存到一个文件中? 如果是自己定义的类的实例,如何保存到一个文件中? 如何从文件中读取数据,并让它们在内存中再次变成自己对应的类的实例? 要设计一套协 ...
- C# 序列化与反序列化之xml对属性或者字段的子类化的子对象进行序列化的解决方案
C# 序列化与反序列化之xml对属性或者字段的子类化的子对象进行序列化的解决方案 xml序列化涉及到XmlRoot,XmlInclude,XmlElement,XmlAttribute,XmlType ...
- C#对象序列化与反序列化zz
C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍........................ ...
- C#对象序列化与反序列化
C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍.......................... ...
- 老王讲自制RPC框架.(四.序列化与反序列化)
#(序列化) 在实际的框架中,真正影响效率的就是数据的传输方式,以及传输的准备,或者说是tcp与http,序列化.当然要想提高整个框架的效率,需要采用一种高效的序列化 框架比如流行的protostuf ...
- Newtonsoft.Json 序列化和反序列化 时间格式
From : http://www.cnblogs.com/litian/p/3870975.html 1.JSON序列化 string JsonStr= JsonConvert.SerializeO ...
- C#序列化与反序列化方式简单总结
序列化和反序列化 相关类: System.SerializableAttribute特性(或称为属性), System.Runtime.Serialization.ISerializable(自定义序 ...
随机推荐
- Window下Latex加速编译方法以及西农毕设论文模板推荐
近些日子用Latex写了一遍文章,一共有11页,但是在window下编译需要2分多的时间,使用的是xeletex编译器. 经过查找,得到了以下方法: 如果坚持使用windows下的latex,使用以下 ...
- NS3 实验脚本的编写步骤
第一步:配置主机,安装模块 (1)创建N个节点: NodeContainer nodes; nodes.Creat(N); 比如我目前接触到的PointToPoint,N就是2 (2)利用拓扑助手He ...
- ZOJ 1456 Minimum Transport Cost(floyd+后继路径记录)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1456 题意:求最短路并且输出字典序最小的答案. 思路:如果用dijkstr ...
- Python的替换函数——replace(),strip(),和re.sub()
在Python中常用的三个"替换"函数是strip(),replace()和re.sub(),下面来讲讲这三个函数的用法. 一.replace() 基本用法:对象.replace( ...
- c assert 用法
#include <stdio.h> /* printf */ #include <assert.h> /* assert */ void print_number(int* ...
- disable某种警告
消除警告: #pragma warning(disable:4786) ZC: 需要消除哪种警告,就在上面填写相应的编号 1. 在 VC6中使用vector<string>时,报类似下面的 ...
- 数据库使用SSIS进行数据清洗教程
OLTP系统的后端关系数据库用于存储不同种类的数据,理论上来讲,数据库中每一列的值都有其所代表的特定含义,数据也应该在存入数据库之前进行规范化处理,比如说“age”列,用于存储人的年龄,设置的数据类型 ...
- RabbitMQ入门_10_队列长度限制
参考资料:https://www.rabbitmq.com/maxlength.html RabbitMQ 有两种方式限制队列长度,第一种是对队列中消息总数进行限制: gordon.study.rab ...
- Maven置标签<scope>
在POM 4中,<dependency>中引入了<scope>,它主要管理依赖的部署.目前<scope>可以使用5个值: * compile,缺省值,适用于所有阶段 ...
- 算法笔记--sg函数详解及其模板
算法笔记 参考资料:https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html sg函数大神详解:http://blog.csdn.net/l ...