关于fastjson在Object转String时的一个坑

关于fastjson在Object转String时的一个坑关于fastjson在Object转String时的一个坑背景在公司的业务中有这么一个场景:需要将某个系统的结果对象放进Hbase中,然后被后续系统读取使用,在Hbase存储的时候,需要将对象中每个属性解析成字符串存入,但一开始存入接口的设计者只考虑了普通类型(Integer、Long、String之类)的字段存储,未考虑Map或者POJO对象的存储,因此原始代码如下: … if(O…

大家好,又见面了,我是你们的朋友全栈君。

关于fastjson在Object转String时的一个坑

背景

在公司的业务中有这么一个场景:需要将某个系统的结果对象放进Hbase中,然后被后续系统读取使用,在Hbase存储的时候,需要将对象中每个属性解析成字符串存入,但一开始存入接口的设计者只考虑了普通类型(Integer、Long、String之类)的字段存储,未考虑Map或者POJO对象的存储,因此原始代码如下:

	...
	if (Objects.nonNull(propertyValue)) { 
   
	     String value = propertyValue.toString();
	     put.add(Bytes.toBytes(family), Bytes.toBytes(properName), Bytes.toBytes(value));
	 }
	 ...

此处直接对对象中各字段的值判空后直接toString进行转换成String类型,当遇到Map或者POJO类时toString返回值是无法进行反序列化的。

以Map为例:
Map<String, Object> map = new HashMap<>(6);
map.put(“abc”, 123);
map.put(“qwe”, “QQQ”);
System.out.println(map.toString());
=================>
输出结果:
{abc=123, qwe=QQQ}
可以看出,根据这个输出结果是无法进行反序列化成Map对象的,POJO类如果不重写toString方法也是同样的道理。

坑记录

由于需求需要,要在Hbase中存储Map对象,所以代码改动如下:

	...
	if (Objects.nonNull(propertyValue)) { 
   
	     String value = JSONObject.toJSONString(propertyValue);
	     put.add(Bytes.toBytes(family), Bytes.toBytes(properName), Bytes.toBytes(value));
	 }
	 ...

测试发现Map对象可以正常被反序列化,看似没问题。结果,第二天大数据团队发现了很多数据统计都为0,排查后发现HBase中有几个字段的存储很怪异,有的字段会出现值被前后多了个双引号,即:本应该是abc的值,在Hbase中以”abc”的形式存在,导致大数据那里统计的数据全部为0。

正确姿势

那么如果遇到这种根据Object转String的情况该怎么处理,很简单,直接贴代码:

		Object obj = "abcd";
        String errStr = JSONObject.toJSONString(obj);
        String str = JSONObject.toJSON(obj).toString();
        System.out.println(errStr);
        System.out.println(str);

=======>
结果很明显:

"abcd"
abcd

Process finished with exit code 0

希望对未遇到过该问题但会经常接触到序列化反序列化的同学有所警示和帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/135441.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • centos 7如何将 网卡ens33 修改成 eth0「建议收藏」

    centos 7如何将 网卡ens33 修改成 eth0「建议收藏」文章目录linux网卡名称命名命名规则修改eth0方法linux网卡名称命名命名规则CENTOS6的网卡命名方式它会根据情况有所改变而非唯一且固定,在CENTOS6之前,网络接口使用连续号码命名:eth0、eth1等,当增加或删除网卡时,名称可能会发生变化CENTOS7命名方式采用dmidecode采集命名方案,以此来得到主板信息;它可以实现网卡名字永久唯一化(dmidecode这个命令可以采集有关硬件方面的信息)对网络设备的命名方式:1)如果Firmware(固件)或B

  • CEMAPI实战攻略(二)——建立与短信信箱的连接

    CEMAPI实战攻略(二)——建立与短信信箱的连接CEMAPI实战攻略by吴春雷QQ:819543772Email:wuchunlei@163.com二.建立与短信信箱的连接上一部分已经讨论过,如何搭建开发和测试环境,以及如何初始化CEMAPI,再

  • mysql数据库SQL查询语句SELECT详细查询(超详细)「建议收藏」

    mysql数据库SQL查询语句SELECT详细查询(超详细)「建议收藏」常规查询查询所有字段:select*from表名;查询指定字段:select列1,列2,…from表名;使用as给字段起别名:select字段as名字….from表名;查询某个表的某个字段:select表名.字段….from表名;可以通过as给表起别名:select别名.字段….from表名as别名;消除重复行:distinct字段条件查询㈠比较运算符:>,<,>=,<=,=,!=,

  • func_get_args()在php71与php56的区别

    func_get_args()在php71与php56的区别

  • nginx 80端口重定向到443端口

    nginx 80端口重定向到443端口

    2021年10月30日
  • CEGUI环境的搭配[通俗易懂]

    CEGUI环境的搭配[通俗易懂]提前准备工具及安装包:1、CMake:一款编译工具下载地址2、CEGUI的源码及依赖项第一个箭头所指,代表是Windows系统的源码包,第二个则是Unix和Linux系统的源码包。配置环境步骤(针对windows平台,图形化操作)Linux下,或者Windows下dos命令也可以完成相应操作,输入相关命令即可。将源码包以及依赖项进行解压如:然后打…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号