Gson:备胎alternate的版本问题

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 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'])


相关文章
|
JSON fastjson Java
FastJson、JackJson 以及 Gson 的区别
FastJson、JackJson 以及 Gson 是 Java 生态圈中三种常用的 Json 解析器,它们均可将 Java 对象序列化为 Json 格式的字符串,也可将 Json 字符串反序列化为 Java 对象。下面我们讨论一下三者在序列化和反序列化操作中的一些区别。
1175 0
|
27天前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
在Java中处理JSON数据:Jackson与Gson库比较
|
6月前
|
JSON 安全 JavaScript
Java一分钟之-JSON处理:Gson与Jackson库
本文对比介绍了Java中常用的两个JSON库Gson和Jackson。Gson以其简洁易用和自动序列化/反序列化功能受到青睐,而Jackson则以优异性能和丰富功能(如字段忽略、日期格式化)著称。文中通过代码示例展示了两者的基本用法,并讨论了常见问题及解决策略,包括时间格式处理、循环引用和类型匹配。在实际应用中,应根据性能需求、安全性和版本兼容性选择合适的库,并遵循最佳实践。
184 0
|
6月前
|
JSON fastjson Java
Gson与FastJson详解
综上,Gson和FastJson都是用于Java对象和JSON数据互相转换的优秀库,选择哪个取决于性能、功能需求和个人偏好。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
97 2
|
12月前
|
JSON 数据格式
gson坑
gson坑
52 0
|
JSON Java API
Gson基本使用
Gson基本使用
132 0
|
JSON 安全 fastjson
gson与fastjson
gson与fastjson
121 0
|
JSON Java API
Gson-更新中
Gson-更新中
197 0
|
JSON Java 数据格式
Gson库的基本使用方法
定义:Gson是Google提供用来java对象和Json数据之间进行映射的库,进行序列化/反序列化。
113 0
|
JSON fastjson Java
scala使用Gson和FastJson解析JSON
kafka传过来的数据好多都是JSON格式,需要对其解析,抽取出应用需要的数据。Gson和FastJson是两个不错的解析工具,以后可能经常会使用到,记录一下,防止以后遗忘。
946 0