关于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

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 百度文库免费下载文档代码

    $(".aside").remove();$("#doc#hd").remove();$(".crubms-wrap").remove();$(".user-bar").remove();$("#doc-header").remove();$(".reader-tools-bar-wrap").remove();$(".fix-searchbar-wra

    2022年4月13日
    52
  • 简单的批处理命令_bat批处理执行cmd命令

    简单的批处理命令_bat批处理执行cmd命令批处理命令简单教程转载来源:https://blog.csdn.net/Joker_N/article/details/89838719文章目录批处理命令简单教程一、常用命令简介1、echo命令2、rem命令3、pause命令4、call命令5、start命令6、goto命令7、set命令二、常用符号简介1、回显屏蔽@2、重定向1>;与>>3、重定向2<4、管道符号|5、转义符^6、逻辑命令符三、命令释义1、文件夹管理2、文件管理3、网络命令4、系统管理四

    2022年8月22日
    6
  • MATLAB强化学习入门——三、深度Q学习与神经网络工具箱

    MATLAB强化学习入门——三、深度Q学习与神经网络工具箱零、为什么需要深度Q学习上一期的文章《网格迷宫、Q-learning算法、Sarsa算法》的末尾,我们提到了Q学习固有的缺陷:由于智能体(agent)依赖以状态-动作对为自变量的Q函数表(QFunctionTable)来形成对当前状态的估计,并以此为依据利用策略π选择动作。Q函数表就必须包含智能体在环境中所可能出现的所有动作-状态对及其对应Q值。显然,当一个多步决策问题变得足够复杂甚至变为连…

    2022年10月3日
    2
  • softmax损失函数理解「建议收藏」

    softmax损失函数理解「建议收藏」softmaxsoftmax的定义假设有一个数组V,ViVi表示V中的第i个元素,那么这个元素的softmax值为:SoftmaxLayer和SoftmaxLossLayersoftmaxLayersoftmax实际上就是logistic的扩展,后者只能二分类,前者则能多分类,实际上都是返回每一类的概率值。在caffe里面softmax的实现分为以下几步(加入输入到softmax里面…

    2022年6月26日
    36
  • Linux文件锁

    Linux文件锁翻阅参考资料,你会发现文件锁可以进行很多的分类,最常见的主要有读锁与写锁,前者也叫共享锁,后者也叫排斥锁,值得注意的是,多个读锁之间是不会相互干扰的,多个进程可以在同一时刻对同一个文件加读锁;但是,如果已经有一个进程对该文件加了写锁,那么其他进程则不能对该文件加读锁或者写锁,直到这个进程将写锁释放,因此可以总结为:对于同一个文件而言,它可以同时拥有多个读者,但是在某一时刻,他只能拥有一个写者。

    2022年6月28日
    43
  • 用js来实现那些数据结构16(图02-图的遍历)

    上一篇文章我们简单介绍了一下什么是图,以及用JS来实现一个可以添加顶点和边的图。按照惯例,任何数据结构都不可或缺的一个point就是遍历。也就是获取到数据结构中的所有元素。那么图当然也不例外。这篇文章

    2022年3月25日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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