fastjson解析json字符串,key缺少双引号导致下游服务无法解析
背景说明
在使用fastjson 1.2.60版本将对象转化为json字符串时,为处理Map值为null的情况,采用了WRITE_MAP_NULL_FEATURES属性,但该属性解析出来的key中缺少双引号,在key包含特殊字符时,如“-”和“:",下游服务在进行反序列化时出现无法解析的错误,从而出现问题。
Fastjson SerializerFeature介绍
使用fastjson解析为字符串时,需要处理一些特殊情况,比如想要在解析后的字符串中显示对象中为null的字段。这个时候就需要用到fastjson的SerializerFeature序列化属性,有以下几个常用属性:
属性 | 含义 |
---|---|
QuoteFieldNames | 输出key时是否使用双引号,默认为true |
UseSingleQuotes | 使用单引号而不是双引号,默认为false |
WriteMapNullValue | 是否输出值为null的字段,默认为false |
WriteEnumUsingToString | Enum输出name()或者original,默认为false |
UseISO8601DateFormat | Date使用ISO8601格式输出,默认为false |
WriteNullListAsEmpty | List字段如果为null,输出为[],而非null |
WriteNullStringAsEmpty | 字符类型字段如果为null,输出为”“,而非null |
WriteNullNumberAsZero | 数值字段如果为null,输出为0,而非null |
WriteNullBooleanAsFalse | Boolean字段如果为null,输出为false,而非null |
SkipTransientField | 如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true |
SortField | 按字段名称排序后输出。默认为false |
PrettyFormat | 结果是否格式化,默认为false |
WriteClassName | 序列化时写入类型信息,默认为false。反序列化是需用到 |
DisableCircularReferenceDetect | 消除对同一对象循环引用的问题,默认为false |
WriteSlashAsSpecial | 对斜杠'/'进行转义 |
BrowserCompatible | 将中文都会序列化为uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false |
WriteDateUseDateFormat | 全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat); |
DisableCheckSpecialChar | 一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false |
除了上述的属性之外,还有WRITE_MAP_NULL_FEATURES,是以下几个属性的组合:
public static final int WRITE_MAP_NULL_FEATURES = WriteMapNullValue.getMask() | WriteNullBooleanAsFalse.getMask() | WriteNullListAsEmpty.getMask() | WriteNullNumberAsZero.getMask() | WriteNullStringAsEmpty.getMask() ;
fastjson WRITE_MAP_NULL_FEATURES 案列说明
map key不包含特殊字符
public static void main(String[] args) { Map<String, Object> map = new HashMap<String, Object>(); map.put("name", "小明"); map.put("age", 12); map.put("sex", null); System.out.println(JSON.toJSONString(map)); // {"name":"小明","age":12} System.out.println(JSON.toJSONString(map, SerializerFeature.WriteMapNullValue)); // {"sex":null,"name":"小明","age":12} System.out.println(JSON.toJSONString(map, SerializerFeature.WRITE_MAP_NULL_FEATURES)); // {sex:null,name:"小明",age:12} }
从上面测试可以看出,使用WRITE_MAP_NULL_FEATURES,输出的json字符串key中并不包含双引号,再进行反序列化测试结果:
public static void main(String[] args) { Map<String, Object> map = new HashMap<String, Object>(); map.put("name", "小明"); map.put("age", 12); map.put("sex", null); String test = JSON.toJSONString(map, SerializerFeature.WRITE_MAP_NULL_FEATURES); // {sex:null,name:"小明",age:12} JSONObject jsonObject = JSON.parseObject(test); System.out.println(JSON.toJSONString(jsonObject)); // {"name":"小明","age":12} }
key包含特殊字符(“-” “:”)的反序列化
public static void main(String[] args) { Map<String, Object> map = new HashMap<String, Object>(); map.put("name", "小明"); map.put("age", 12); map.put("sex", null); // 包含特殊字符时 "-" 或者 ":"时 map.put("test:test", "test"); String test = JSON.toJSONString(map, SerializerFeature.WRITE_MAP_NULL_FEATURES); System.out.println(test); // {test-test:"test",sex:null,name:"小明",age:12} JSONObject jsonObject = JSON.parseObject(test); System.out.println(JSON.toJSONString(jsonObject)); // 抛出异常 com.alibaba.fastjson.JSONException }
结论
- 从上面的测试可以看出WRITE_MAP_NULL_FEATURES转化为json字符串时key是不包含双引号的,当key中不存在特殊字符("-"或“:")时,可以进行正常的反序列化操作,包含了上面的特殊字符时会出现无法解析的异常。
- 另外,对于不带双引号的key,Gson也存在这样的问题,但其可以正常解析含有"-"的特殊字符,无法解析包含":"情况。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
智慧城市物联网解决方案的五大示例
智慧城市利用物联网传感器和高级分析来改善城市服务和城市生活其他方面的性能,从而提高效率并改善市民的生活质量 新加坡、纽约、东京和伦敦有什么共同之处?预计到2020年,他们将在各种智慧城市项目上投入10亿美元以上。这也难怪:目前城市拥有世界人口的一半以上——55%,并且预计到2050年,这个数字将跃升到68%。将先进技术整合到市政基础设施,将为市政府提供一种更有效地管理其资源和资产的方式,以帮助他们更好地满足未来需求。 世界各地已经有了很多智慧城市解决方案的范例,我们在下面列出了五种最有益的应用。 什么是智慧城市? 智慧城市利用物联网传感器和高级分析来改善城市服务和城市生活其他方面的性能,从而提高效率并改善市民的生活质量。 智慧城市解决方案:改善治理的五个例子 一、智能废物管理系统 随着城市废物产生量的增加,市政当局正在寻找提高收集效率的方法。废物管理人员不是使用预定的路线和固定的收集时间表,而是依靠安装在垃圾箱中的传感器来测量填充水平,并在垃圾箱即将装满之前通知他们。韩国首尔通过智能垃圾管理系统将垃圾收集成本降低了83%,同时消除了垃圾外溢现象;旧金山最近还在全市范围内安装了1000个...
- 下一篇
在Joomla 4中,模块样式将转移到布局文件
在Joomla博客中,我们已经为明年的Joomla 4版本撰写了大量文章。 在本教程中,我将讨论Joomla 4中的一项技术更改,它将对设计人员产生重大影响。 在Joomla中,模块样式定义模块的HTML输出。这些样式控制模块标题,标题和类后缀的输出。 在Joomla 3之前,模块样式是通过位于每个模板/html文件夹内名为modules.php的唯一文件来管理的。 从Joomla 4开始,模块样式将在布局文件中进行管理。 在这篇文章中,我将向您介绍在即将发布的Joomla 4中实现样式化模块的新方法。 Joomla 3中的模块样式如何工作 首先,让我解释一下Joomla 3中的模块样式是如何工作的。 例如,在/templates/ Protostar /index.php文件中定义了Protostar模板中的模块 position-7,定义如下: 在上面的代码中,style属性是“well”。这种样式的HTML结构是通过一个名为modChrome_style()的方法在/templates/protostar/ HTML /modules.php文件中定义的。因此,本例中的方法名为m...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- 设置Eclipse缩进为4个空格,增强代码规范
- Mario游戏-低调大师作品
- MySQL8.0.19开启GTID主从同步CentOS8
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果