关于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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • stringtokenizer java,Java中的StringTokenizer「建议收藏」

    stringtokenizer java,Java中的StringTokenizer「建议收藏」Java中的StringTokenizerjava.util.StringTokenizer类允许您将字符串分成令牌。这是打破字符串的简单方法。它没有提供区分数字,带引号的字符串,标识符等的功能,例如StreamTokenizer类。我们将在I/O一章中讨论StreamTokenizer类。StringTokenizer类的构造方法StringTokenizer类中定义了3个构造函数。Constr…

    2022年8月11日
  • malloc 函数详解

    malloc 函数详解很多学过C的人对malloc都不是很了解,知道使用malloc要加头文件,知道malloc是分配一块连续的内存,知道和free函数是一起用的。但是但是:一部分人还是将:malloc当作系统所提供的或者是C的关键字,事实上:malloc只是C标准库中提供的一个普通函数而且很多很多人都对malloc的具体实现机制不是很了解。1,关于malloc以及相关的几个函数     #include&lt;s…

    2022年4月26日
  • Jlink-10 pin 的定义(stm32使用)官方定义

    Jlink-10 pin 的定义(stm32使用)官方定义因为在网上找了好久才找到正确的接法,所以专门记载了下来,因为stm32芯片这几个功能引脚会内置上拉电阻,所以不需要再外接电阻了。转载于:https://www.cnblogs.com/dzswise/p/7523420.html…

    2022年5月28日
  • Tomcat的下载及安装

    Tomcat的下载及安装一、Tomcat下载1、打开Tomcat官网,默认进入官网首页,官网地址为:https://tomcat.apache.org/2、左侧的导航栏可以看到Download(下载),以及最近相关版本的Tomcat(9、8、7…),这里选择的是Tomcat8,点击进入3、进入tomcat8的相关页面后会显示一些该版本的信息,可以忽略,鼠标下滑进行查找4、这里我们可以看到…

    2022年5月19日
  • 为企业数字化转型提供服务_数字赋能企业转型

    为企业数字化转型提供服务_数字赋能企业转型企业数字化转型必备利器之微服务扩展

    2022年4月21日
  • SpringBatch概述

    SpringBatch概述1、SpringBatch简介1.1、简介根据Spring官网描述,SpringBatch是一个轻量级的、完善的批处理应用框架,旨在支持企业系统建立健壮、高效的批处理应用。然而SpringBatch不是一个调度框架,它只关注于任务的处理,如日志监控、事务、并发问题等,但是它可以与其它调度框架一起联合使用,完成相应的调度任务,如Quartz、Tivoli、Control-M等。Sprin…

    2022年5月8日

发表回复

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

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