Gson:备胎alternate的版本问题

简介: Gson:备胎alternate的版本问题

前言

最近在数据接入的工作中,接入了两种json日志数据。它们只有一个字段名称不一致的,我将接入的数据存放在Kafka中,然后解析成CSV格式,最后生成文件并加载到数据库,生成数据表。这里我决定使用Flume来完成这个需求。

实现方法就是通过Java来编写Flume的拦截器,对json进行解析。按照常理的做法肯定是先定义两个实体类,并定义两个Interceptor来解析。但是我觉得肯定有更好的方法来实现这种情况,正好最近抛弃了fastjson的我决定拥抱Gson,去研究如何定义一个实体类和Interceptor来解析。

实体类代码如下:

public class NlkfReqDomain {
    private String logday;
    @SerializedName(value = "reqcontent", alternate = {"rspcontent"})
    private String content;
    private String reqdate;
    @SerializedName("@version")
    private String version;
    private String type;
    @SerializedName("@timestamp")
    private String timestamp;
 }

从上面代码可以看出:对于content字段我们使用了注解SerializedName来修饰。

@SerializedName的value属性是序列化和反序列化的字段名称。 alternate是反序列化时没有value对应的字段名的时候的才会用到的备胎名集合

gson版本问题

例如定义两个json格式的字符串

从字符串转换成实体类的过程就是反序列化从实体类转换成json的过程就是序列化:

不难看出,value属性的inContent值参与了序列化和反序列化,alternate里面的备胎outContent只参与了反序列化。

信心满满的对上面@SerializedName的用法了如指掌的时候,outContent字段解析出来的是null,我以为是忘记了编译,clean之后再次package,发现输出还是null。

因为outContent字段特别长,记得flume中有个event(数据)最大限制,所以我就去查看flume打印的日志,但是没有报错!!!

在本机写了个demo发现outContent是可以正常解析的。难道是代码灵异事件????查找多处资料后,发现

alternate只有在2.4版本之后才能使用

本地使用的Gson2.8,并且将依赖打进了jar包,但是flume中lib下居然有个gson-2.2.2.jar(奔溃中...),根据java的类加载原理,gson2.2加载之后就不会加载gson2.8中重复的class,在删除了gson-2.2.2.jar之后,小手一阵敲打,jps -m | grep xxx | xargs kill -9并sh xxx.sh重启flume,完成解析!!

结语

Python的json解析通过json包就可以,不需要预先定义实体类,是真的方便。以下的代码也可以解决上面的难题,遗憾Flume不支持python实现...。

import json  
str1 = "{\"inContent\": \"Hello World\"}"
str2 = "{\"outContent\": \"Hello World\"}"
// 两条命令均输出Hello World
print(json.loads(str1)['inContent'])
print(json.loads(str2)['outContent'])


目录
打赏
0
0
0
0
2
分享
相关文章
【MongoDB】如何在MongoDB中设计Schema?
【4月更文挑战第2天】【MongoDB】如何在MongoDB中设计Schema?
我的程序员之路:自学Java篇
我的程序员之路:自学Java篇
|
8月前
|
鸿蒙next版开发:ArkTS组件通用属性(Popup控制)
在HarmonyOS 5.0中,ArkTS提供了灵活的Popup控制属性,允许开发者创建和管理弹出窗口,用于显示额外信息、提示、表单等,增强用户交互体验。本文详解了Popup控制的通用属性,并提供了示例代码。通过bindPopup方法,可以将弹出窗口绑定到组件上,支持多种用途,如显示额外信息、表单提交和交互反馈。
384 1
MySQL UDF提权
通过这些内容的详细介绍和实际案例分析,希望能帮助您深入理解MySQL UDF提权的机制、实现步骤及防范措施,提高系统的安全性和防护能力。
428 11
[LDAP: error code 34 - invalid DN]
`亲测可用,之前搜索了很多博客,啥样的都有,就是不介绍报错以及配置用处,根本不懂照抄那些配置是干啥的,稀里糊涂的按照博客搭完也跑不起来,因此记录这个。` `项目背景`:公司项目当前采用http协议+shiro+mysql的登录认证方式,而现在想支持ldap协议认证登录然后能够访问自己公司的项目网站。 `举例说明`:假设我们公司有自己的门户网站,现在我们收购了一家公司,他们数据库采用ldap存储用户数据,那么为了他们账户能登陆我们公司项目所以需要集成,而不是再把他们的账户重新在mysql再创建一遍,万一人家有1W个账户呢,不累死了且也不现实啊。
165 13
[LDAP: error code 34 - invalid DN]
OSPF中的Router LSA详解
OSPF中的Router LSA详解
307 4
备份SaaS数据的5个原因
【10月更文挑战第28天】SaaS虽被认为是几乎全能的解决方案,但企业仍需对业务和利润保持警惕。备份SaaS数据至关重要,原因包括:恢复过程可能缓慢;服务条款可能变化;云端数据并非永恒;人为错误难以避免;以及防止信息失控。因此,企业应确保有独立备份以应对各种风险。
181 0
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
142 1
kafka2.x常用命令笔记(一)创建topic,查看topic列表、分区、副本详情,删除topic,测试topic发送与消费
kafka2.x常用命令笔记(一)创建topic,查看topic列表、分区、副本详情,删除topic,测试topic发送与消费
698 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问