关于前后端JSON解析差异问题与思考-世界聚焦
来源:阿里开发者    时间:2023-06-20 10:53:36

点击链接阅读原文,获取更多技术内容: https://developer.aliyun.com/article/1247396?utm_content=g_1000374167

本文主要总结了作者在一次涉及流程表单的需求发布中遇到的问题及思考总结。


(相关资料图)

作者 | 载宁

来源 | 阿里开发者公众号

一、问题回顾

在一次涉及流程表单的需求发布时,由于表单设计的改动,需要在历史工单中的一个json字段增加一个属性,效果示意如下:

[{\"key1\":\"value1\"}] ->[{\"key1\":\"value1\", \"key2\":\"value2\"}]

由于历史数据较多,采用了通过odc从数据库查询数据,线下开发数据处理脚本,更新数据后生成sql去线上执行,脚本示例如下。

String target = JSON.toJSONString(      JSON.parseObject(oraData).put(\"key2\",\"value2\")  )

在数据变更时未发现问题,存量工单抽查显示正常。但在第二天有业务反馈,有部分工单出现前端异常导致无法展示的问题。

根据经验分析,这类问题一般是前端在处理数据时出现异常导致,考虑到昨天对工单中的一个json字段进行了变更,初步推断应该是该字段变更后影响了前段解析。

为了验证猜测,将前端查询的接口返回数据,拷贝到在线解析json的网站中进行解析测试。结果发现页面解析失败,观察发现json中包含回车,回车删除后解析正常。在dev验证删除后数据解析正常后,应急对线上异常工单进行了处理。

二、问题思考

2.1 JavaScript如何解析json字符串

首先在Chrome控制台做一个简单的json解析实验,过程如下:

var str = \"{\"key\":\"v1\nv2\"}\"console.log(str)// 打印结果 {\"key\":\"v1
v2\"}console.log(JSON.parse(str))// 打印结果 {key: "v1
v2"}console.log(JSON.parse(str).key)// 打印结果 v1// v2

经过测试,可以得到以下结论:

1)JavaScript在加载字符串时,会自动识别 斜杠 并进行反转义;

2)在进行json解析,会对值对应的字符串进行二次反转义,将 解析为回车字符。

在查阅JSON官方对parse工具的流程说明后,印证了上述测试。

但在处理过程中,我们看到解释器的允许通过范围,有说明不包含control character。常见的回车、换行等字符都属于control character。

所以可以推测,在JavaScript解析json时,如果遇到control character,可能会引起异常情况。

为了验证猜想做了以下对比实验。

经过测试可以发现,在JavaScript使用的JSON解析器sdk中,会对于字符串中的control character进行校验,如遇到则会直接抛出异常。由于JavaScript在加载字符串时会先做一次字符转义,会将” “转换为回车字符,即 (byte) 13,使得解析JSON时提示异常。

这里会出现一个新的疑问,字符转义这个问题看起来是会经常出现的,为什么到现在才碰到一次呢。这里继续对JavaScript的JSON编码器进行测试。

经过测试可以发现,JavaScript在对字符串进行JSON编码时,会自动对字符串中的斜杠进行编码,正好对应了在JSON解码时对字符串自动解码。到这里可以明白了,同时仅使用JavaScript的JSON编码器和解码器,会自动对control character进行转义和反转义处理,不会出现异常。那在Java中呢?

剩余60%,完整内容请点击下方链接查看: https://developer.aliyun.com/article/1247396?utm_content=g_1000374167

阿里云开发者社区,千万开发者的选择。百万精品技术内容、千节免费系统课程、丰富的体验场景、活跃的社群活动、行业专家分享交流,尽在:

关键词:

X 关闭

X 关闭