再争论一个 json 转义的问题

2020-06-13 19:41:09 +08:00
 lagoon
{\"身份\":\"学生\",\"姓名\":\"张三\"}

这就是后台给的 json 原文,换种说法,也就是接口拿到的实际数据。嗯...甚至还有带\和不带的混合双打。

众所周知这是转义,但我目前所知,dart,android 用的 gson,ios 都是无法直接将它转 json 对象的。需要先经过处理,把\去掉。
但后台,一般觉得这是规范的 json 。


每次遇到这个问题,都吵的不可开交。

请大家评理。


真的心累,不知道实际该怎么看待。因为很常见,我转不了,但后台又非常生气,觉得肯定是没问题。
5997 次点击
所在节点    程序员
57 条回复
watzds
2020-06-13 22:10:20 +08:00
@ipwx 那种 json 里套字符串 json 的,要 parse 两次
lagoon
2020-06-13 22:20:40 +08:00
@ralu 👍
cigarzh
2020-06-13 22:24:16 +08:00
https://www.json.org/ 在 A4 纸上打印出来然后狠狠的甩在他脸上
fundon
2020-06-13 22:40:03 +08:00
很明显后端序列化了两次后输出,不是拿一个对象(字典、Map )去序列化,而是拿字符串去序列号
ipwx
2020-06-13 22:58:14 +08:00
@watzds 那你为啥要这么干?而且套了一个字符串,读出来的值不是带斜杠的啊。。。楼主当然指的是值就有斜杆。
watzds
2020-06-13 23:24:06 +08:00
@ipwx 我可没这么干。
见识太少了,前后端都懂的人,对这些不会有困惑。字符串里有引号,当然会转义。

一种情况是,后端拿到的时候就已经是 json 了,后端也不关心这个 json 的内部(可能是前端生成的配置),直接当一个对象的 string 属性,再把这个对象序列化后传给前端,没记错的话,记得奇妙清单就是这么干的
iceheart
2020-06-14 06:26:28 +08:00
传啥都行,先写进接口文档里再搞。
有歧义就查文档,文档没写的就补上。
namelosw
2020-06-14 09:39:31 +08:00
这个是合法的 JSON.
但是这个 JSON 的类型是字符串.
这个字符串还是个 JSON.
这个字符串 JSON 解析完是个对象.

我理解这个接口是想返回这个对象,那应该返回不带转义的,不然就是序列化了两次.
lagoon
2020-06-14 10:02:37 +08:00
@namelosw 应该是序列化了 2 次。
如果只是一次,那么这个\就不会存在了。也不存在混合双打的情况。
tairan2006
2020-06-14 10:15:54 +08:00
这一般不是序列化了两次,而是把数据库里的 Json 字段当纯文本返回给客户端了。

正确的处理方法:在返回之前反序列化一次就可以了。Java+Mybatis 用 TypeHandler 转成 JsonNode 就行,Go 自己写一个类,其他的也类似。
lagoon
2020-06-14 11:40:38 +08:00
@tairan2006 是的,其实处理都简单。

争论的关键点在于这个是不是符合 json 规范的。特别是混合双打的情况下。
iEverX
2020-06-14 14:09:56 +08:00
找 json 的规范甩给他
netnr
2020-06-14 15:39:26 +08:00
在获取 JSON 对象时,一个是 字符串,一个是 object
后端应该处理成 object,不然前端 JSON.parse 解析几次
返回转义的 JSON 字符串是没问题,但肯定是不推荐的,你看各大服务商提供的接口,不管层级多深,肯定不会有转义字符
Vitta
2020-06-14 16:13:00 +08:00
记得看过一个大哥发过他们的后端返回过 丨 这个字
Hieast
2020-06-14 18:00:10 +08:00
这个返回值既不是字符串,也不是对象
https://www.json.org/json-zh.html
字符串应该以 `"` 开头,这个返回值不是,所以不是字符串
对象以 `{` 开头,然后里面的 key 和 value 需要是字符串类型以 `"` 开头,但是里面的 key 和 value 都是以 `\` 开头的,所以也不是对象

后端返回的是代码原文,得执行 eval 才能正确解析,这个风险肯定很高。这个返回值肯定不是用 json dump 的标准库处理得到的,太奇葩了
Reficul
2020-06-14 20:24:52 +08:00
V2EX 竟然也能有这么多搞不清序列化的老哥
rokeyzhao
2020-06-17 17:53:43 +08:00
json 和 json 字符串的区别

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/681306

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX