文档章节

记录一个JSON字符串反序列化问题

北风其凉
 北风其凉
发布于 2017/06/26 16:22
字数 602
阅读 49
收藏 0
点赞 0
评论 0

最近工作中遇到一个问题,有A、B两个系统要进行通信。双方开发人员约定了一个类,A系统将数据填入类中,再将类序列化成JSON字符串,字符串传递到B系统后,B系统再反序列化此字符串,得到数据。在一次通信过程中,程序突然报错,提示反序列化失败,排查问题时发现,A、B两系统序列化和反序列化使用了不同的库。A系统使用fastjson进行序列化,B系统使用jackson进行反序列化,两个库在序列化JSON串时存在区别。

废话不多说,直接上代码。

首先明确下需要添加的引用:

fastjson:fastjson-1.1.26.jar

jackson:

1、jackson-annotations-2.2.1.jar

2、jackson-core-2.2.1.jar

3、jackson-core-asl-1.8.8.jar

4、jackson-databind-2.2.1.jar

5、jackson-mapper-asl-1.8.8.jar

6、jackson-module-jaxb-annotations-2.2.1.jar

现有类PersonInfo如下

public class PersonInfo {
    String name;
    String remark;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getRemark() {
        return remark;
    }
    public void setRemark(String remark) {
        this.remark = remark;
    }
}

测试场景有3:

1、使用fastjson对此类进行序列化,并打印序列化结果

2、使用jackson对此类进行序列化,并打印序列化结果

3、使用jackson对fastjson序列化后的字符串进行反序列化


import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;

import com.alibaba.fastjson.JSON;

public class MyProgram {

    public static void main(String args[]) {
        
        try {
            PersonInfo personInfo = new PersonInfo();
            personInfo.setName("Tsybius");
            personInfo.setRemark("[\t\r\n]");
            
            //使用fastjson序列化类
            String jsonString = JSON.toJSONString(personInfo);
            System.out.println(jsonString);

            System.out.println("-----------------------");

            //使用jackson序列化类
            ObjectMapper mapper = new ObjectMapper();
            mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
            
            String jsonString2 = mapper.writeValueAsString(personInfo);
            System.out.println(jsonString2);

            System.out.println("-----------------------");

            //使用jackson反序列化fastjson序列化结果(报错)
            mapper.readValue(jsonString, PersonInfo.class);

        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
}

运行结果如下:

{"age":26,"bornDate":687944560794,"name":"Tsybius","remark":"[    \r\n]"}
-----------------------
{"name":"Tsybius","age":26,"bornDate":687944560794,"remark":"[\t\r\n]"}
-----------------------
Illegal unquoted character ((CTRL-CHAR, code 9)): has to be escaped using backslash to be included in string value
 at [Source: java.io.StringReader@6ebc05a6; line: 1, column: 64]

可以看到,fastjson将水平制表符当做字符处理,而jackson将水平制表符转义为\t处理,因此,使用jackson反序列化fastjson生成的JSON字符串时,直接报错。

结论:对于使用JSON字符串作为中间介质通信的系统,双方使用的序列化和反序列化类尽量保持一致,以免在反序列化过程中触发不必要的麻烦。

© 著作权归作者所有

共有 人打赏支持
北风其凉

北风其凉

粉丝 114
博文 493
码字总数 462457
作品 4
朝阳
程序员
httpclient提交json到tomcat,接收到的json却是不完整的

写了一个rest接口,接口接受json数据解析批量入索引。入索引的频率和大都挺大的,每天看日志都会有几条写入失败,原因是收到client端的数据不完整,是一个被截断的json。如图: 我是通过htt...

coder4j ⋅ 2017/12/19 ⋅ 8

PHP多种序列化/反序列化的方法

序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。 1. s...

cnu2m ⋅ 2012/11/08 ⋅ 0

PHP 序列化变量的 4 种方法

序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。 1. s...

mickelfeng ⋅ 2013/01/12 ⋅ 1

PHP多种序列化/反序列化的方法

serialize和unserialize函数 这两个是序列化和反序列化PHP中数据的常用函数。 当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙...

京牛教育科技 ⋅ 2016/08/27 ⋅ 2

PHP多种序列化以及反序列化

PHP多种序列化以及反序列化 PHP点点通2016-09-2147 阅读 序列化PHP 序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个...

PHP点点通 ⋅ 2016/09/21 ⋅ 0

反序列化JSON字符串

1.直接反序列化JSON字符串 //引用序列化、反序列化JSON字符串用到的空间 using Newtonsoft.Json; using Newtonsoft.Json.Linq; //定义一个JSON字符串 string jsonText = "[{'a':'aaa','b':'...

林枫i ⋅ 2015/12/23 ⋅ 0

eric_1989/jfire-codejson

Jfire-codejson框架 标签: 最高性能 Json [TOC] ##框架优点 性能强劲 codejson是迄今为止最为强大的json框架.性能为fastjson的2.1倍,jackson2的1.8倍,gson的6.7倍。下图为基准测试数据 自由...

eric_1989 ⋅ 2015/11/15 ⋅ 0

Model进行json的序列化与反序列化问题

由于业务需求,我想要在程序里把model序列化成json,然后能再序列化回来。 我现在是调用model.toJson()方法得到字符串,反序列化就把字符串用json工具反序列化成Map,然后调用model.setAttr...

台俊峰 ⋅ 2014/12/08 ⋅ 2

C++对象的JSON序列化与反序列化探索

C++对象的JSON序列化与反序列化探索 一:背景 作为一名 C++ 开发人员,我一直很期待能够像 C# 与 JAVA 那样,可以轻松的进行对象的序列化与反序列化,但到目前为止,尚未找到相对完美的解决方...

souldepth ⋅ 2016/07/05 ⋅ 0

使用fastjson的filter机制将String属性转成复杂类型

今天遇到一个很棘手的问题,由于前期设计的失误,导致了数据库中的一个字段不得不用json存储一个非常复杂的对象,前端获取到复杂对象后利用json序列化成jsonstring后存到db中的字段 获取数据...

王小明123 ⋅ 01/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

linux 安装docker

通过以下命令下载安装docker wget -qO- https://get.docker.com | sh 执行以上命令后输出以下内容说明安装成功,注意红框中的内容,docker安装成功后默认只有root能使用,红框中给出的提示是...

haoyuehong ⋅ 16分钟前 ⋅ 0

482. License Key Formatting - LeetCode

Question 482. License Key Formatting Solution 思路:字符串转化为char数组,从后遍历,如果是大写字母就转化为小写字母,如果是-就忽略,如果遍历了k个字符(排除-)就追加一个-。 Java实现...

yysue ⋅ 35分钟前 ⋅ 0

聊聊spring cloud gateway的LoadBalancerClientFilter

序 本文主要研究一下spring cloud gateway的LoadBalancerClientFilter GatewayLoadBalancerClientAutoConfiguration spring-cloud-gateway-core-2.0.0.RELEASE-sources.jar!/org/springfram......

go4it ⋅ 59分钟前 ⋅ 0

详解:Nginx反代实现Kibana登录认证功能

Kibana 5.5 版后,已不支持认证功能,也就是说,直接打开页面就能管理,想想都不安全,不过官方提供了 X-Pack 认证,但有时间限制。毕竟X-Pack是商业版。 下面我将操作如何使用Nginx反向代理...

问题终结者 ⋅ 今天 ⋅ 0

002、nginx配置虚拟主机

一、nginx配置虚拟主机可分为三种方式,分别为: 1、基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站 2、基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站...

北岩 ⋅ 今天 ⋅ 0

shell脚本之死循环写法

最近在学习写shell脚本,在练习if while等流程控制时,突然它们的死循环写法是怎么样的?经过百度与亲测记录如下: for死循环 #! /bin/bashfor ((;;));do date sleep 1d...

hensemlee ⋅ 今天 ⋅ 0

苹果的ARKit2.0有多可怕,看了就知道

序言 ARKit主要由三部分组成: 跟踪(Tracking) 跟踪是ARKit的核心组件之一,其提供了设备在物理世界中的位置与方向信息,并对物体进行跟踪,如人脸。 2.场景理解(Scene Understanding) 场...

_小迷糊 ⋅ 今天 ⋅ 0

5.1 vim介绍 5.2 vim移动光标 5.3 ,5.4vim一般模式下移动光标,复制粘贴

vim命令 vim是vi的一个升级版;vim可以显示文字的颜色 安装vim这一个包vim-enhanced 如果不知道安装包,可以使用 命令下面命令来查看vim命令是那个包安装的。 [root@linux-128 ~]# yum prov...

Linux_老吴 ⋅ 今天 ⋅ 0

vim一般模式

vim 是什么 vim是什么 ? 在之前接触Linux,编辑网卡配置文件的时候我们用过了vi ,vim简单说就是vi的升级版,它跟vi一样是Linux系统中的一个文本编辑工具。 如果系统中没有vim ,需要安装一...

李超小牛子 ⋅ 今天 ⋅ 0

docker实战

构建企业级Docker虚拟化平台实战 重点剖析虚拟化和云计算概念; 分析Docker虚拟化的概念和原理; 从0开始实战Docker虚拟化平台; 基于Docker构建Nginx WEB服务器和CentOS虚拟机; 基于开源监...

寰宇01 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部