再争论一个 json 转义的问题

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

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

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


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

请大家评理。


真的心累,不知道实际该怎么看待。因为很常见,我转不了,但后台又非常生气,觉得肯定是没问题。
5680 次点击
所在节点    程序员
57 条回复
lagoon
2020-06-13 19:41:53 +08:00
顺便一提,js 是可以的。
msg7086
2020-06-13 19:47:22 +08:00
这不是 JSON 原文,这是把 JSON 又做了一边转义的结果。

比如
var a = "{\"身份\":\"学生\",\"姓名\":\"张三\"}"

a 的内容是什么?
是 {"身份":"学生","姓名":"张三"}

上面 var a 后面的是为了把 JSON 表示成字符串而做的一层额外转义。变量内部是没有斜线的。

所以后台要么给
"{\"身份\":\"学生\",\"姓名\":\"张三\"}"
也就是两次序列化,

要么给
{"身份":"学生","姓名":"张三"}
也就是一次序列化。
also24
2020-06-13 19:48:13 +08:00
要不要试试先把它当 JSON String 而不是 JSON Object

https://i.loli.net/2020/06/13/WPlr4MVNJE7XxmZ.png
lagoon
2020-06-13 19:49:46 +08:00
@msg7086 但我遇到过的后台哥,全部非常肯定,这就是 json,肯定能转。
also24
2020-06-13 19:50:36 +08:00
我的描述好像容易引起歧义,我重洗说一下
lagoon
2020-06-13 19:54:48 +08:00
@also24 所以我没敢回复,有点看不懂
EminemW
2020-06-13 19:56:12 +08:00
你这个是字符串吧。。你把字符串转成 JSON 对象不就好了
nc4697
2020-06-13 19:56:54 +08:00
这不叫 JSON 。这是 JSON 格式的字符串
also24
2020-06-13 19:57:58 +08:00
@lagoon #6
我的锅,这个专业撞上了 Python 的转义,没能表达出我的意思

我还是直接写文本吧。

按道理来说,你可以在这个字符串外面再套一层就好理解了

{
"str": "{\"身份\":\"学生\",\"姓名\":\"张三\"}"
}

大意如上,服务器返回的内容被当作嵌套了一层 JSON String,这样再拿 str 字段出来的时候,就会处理掉转义了。

实际上大意和二楼是一致的,只是我不小心举了个错误的例子。
lagoon
2020-06-13 20:00:52 +08:00
@also24 我在 dart 和 java 上的体验,拿出来,就是{\"身份\":\"学生\",\"姓名\":\"张三\"},除非自己手动转义。所以尴尬
kojirou
2020-06-13 20:00:58 +08:00
?
let str = """
{\"身份\":\"学生\",\"姓名\":\"张三\"}
"""
dump(try JSONSerialization.jsonObject(with: Data(str.utf8), options: []))
kojirou
2020-06-13 20:02:55 +08:00
不好意思看错了,无视我
FutherAll
2020-06-13 20:03:35 +08:00
就是个 JSON string,iOS 可以转
jorneyr
2020-06-13 20:04:27 +08:00
把后台给的 JSON 字符串放到 http://json.cn 里试试,如果报错说明不是 JSON 字符串,如果不报错说明正确的 JSON 字符串,可以多试几个这样的工具,用事实解决争论。
lagoon
2020-06-13 20:07:23 +08:00
@jorneyr 没用。这招早用过了。
他们一口咬定可以。
jorneyr
2020-06-13 20:11:10 +08:00
@lagoon 那这一家不是正确与否的问题了,而是人的问题
lagoon
2020-06-13 20:14:30 +08:00
@jorneyr 但不是一个人,是我遇到的 n 位后台....
lagoon
2020-06-13 20:15:56 +08:00
@FutherAll
我估计你是类似
var str = "{\"身份\":\"学生\",\"姓名\":\"张三\"}"
这样去验证的对吧?

不是的,这样你断点看看 str,\已经被转义了。json 处理时没有\了
also24
2020-06-13 20:28:09 +08:00
重新敲了个例子,不知道这样是否好理解点

https://i.loli.net/2020/06/13/eE1zGyB2M9lUNoX.png
zhuangzhuang1988
2020-06-13 20:30:51 +08:00
直接 base64 把.

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

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

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

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

© 2021 V2EX