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


相关推荐

  • Linux 系统中的主要目录有哪些?_linux系统中进程有哪些类型

    Linux 系统中的主要目录有哪些?_linux系统中进程有哪些类型简介本文讲解SNMPTrap,在介绍Trap概念之前,首先认识一下SNMP吧。简单网络管理协议(SimpleNetworkManagementProtocol)是一种应用层协议,是TCP/IP协议族的一部分。它使网络设备之间能够方便地交换管理信息。能够让网络管理员管理网络的性能,发现和解决网络问题及进行网络的扩充。目前SNMP已成为网络管理领域中事实上

    2022年8月22日
    4
  • java变量设置_如何正确的配置JAVA环境变量

    java变量设置_如何正确的配置JAVA环境变量原创:YiKiA2Data什么是环境变量?环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。为什么要配置环境变量?为了方便在控制台编译和运行java程序,不必进入到java的程序目录里面去运行。这样你放在任何目录下的java程序文件都可以编译运行,而不是必须把这个程序文件放在java.exe和javac.exe所在的目录下。什么是JAVA_HOME…

    2022年7月7日
    24
  • qq登录钓鱼php网页,PHP+JS模仿登录钓鱼「建议收藏」

    qq登录钓鱼php网页,PHP+JS模仿登录钓鱼「建议收藏」目录介绍login.php正常登录的文件selfLogin.php自定义的登录文件data.txt记录用户输入的数据login.phpecho””;$userInfo=$_POST;if($userInfo){#code…var_dump($userInfo,’登录成功’);exit();}?>登录用户姓名:用户密码://js劫持代码window.onload…

    2022年8月24日
    5
  • Thread.IsBackground

    Thread.IsBackground解释:  获取或设置一个值,该值指示某个线程是否为后台线程。  后台线程不会防止应用程序的进程被终止掉。        注意:主线程中创建了一个线程,线程的IsBackground默认是设置为FALSE的。主线程退出时,IsBackground=FALSE线程继续执行下去,直到线程执行结束。IsBackground=TRUE的线程才会随着主线程的退出…

    2022年10月17日
    0
  • cocos creator 部署微信云开发

    cocos creator 部署微信云开发cocoscreator部署微信云开发

    2025年7月17日
    0
  • wake_lock_timeout的用法[通俗易懂]

    wake_lock_timeout的用法

    2022年1月22日
    44

发表回复

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

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