再争论一个 json 转义的问题

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

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

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


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

请大家评理。


真的心累,不知道实际该怎么看待。因为很常见,我转不了,但后台又非常生气,觉得肯定是没问题。
5997 次点击
所在节点    程序员
57 条回复
dasauto
2020-06-13 20:36:09 +08:00
我之前在项目上也碰到过,手动狗头
lagoon
2020-06-13 20:37:21 +08:00
@dasauto 真的是很常见。我已经遇到不止一次了。
crella
2020-06-13 20:38:53 +08:00
代码

# -*- encoding : utf-8 -*-
require 'json'
str = '{\"身份\":\"学生\",\"姓名\":\"张三\"}'
a = JSON.load(str)
puts a.inspect

结果报错。
/usr/local/ruby-2.7.0/lib/ruby/2.7.0/json/common.rb:156:in `parse': 783: unexpected token at '{\\"身份\\":\\"学生\\",\\"姓名\\":\\"张三\\"}' (JSON::ParserError)
from /usr/local/ruby-2.7.0/lib/ruby/2.7.0/json/common.rb:156:in `parse'
watzds
2020-06-13 20:39:53 +08:00
可能是后端手写的 json,笑死人了,有些人不知道序列化
Trim21
2020-06-13 20:41:35 +08:00
混合双打出来还能正确 decode 吗…
also24
2020-06-13 20:44:09 +08:00
@crella #23
还要处理掉 python 本身对 \ 的转义,所以应该是两个 \
dasauto
2020-06-13 20:56:25 +08:00
@lagoon
这种真的是想骂人
nicebird
2020-06-13 21:04:59 +08:00
难道手写的 json???
ipwx
2020-06-13 21:06:19 +08:00
这问题还用争论?把这个字符串扔进文本文件,让后端读出来自己用标准 JSON Parser 解析,看看他们行不行。这还能不闭嘴?能解析除非是调用了 eval 。
ipwx
2020-06-13 21:06:34 +08:00
如果用了 eval 就更简单了,给他们展示一下脚本注入。
FutherAll
2020-06-13 21:11:10 +08:00
@lagoon 还真是,默认转义了\
不过我还是没理解,从接口拿到的数据是啥格式的,var str = "{\"身份\":\"学生\",\"姓名\":\"张三\"}"
这种默认转移掉不是可以解析么,是带了两个\\么
maobukui
2020-06-13 21:12:21 +08:00
转义的目的为了防止语法上的歧义。
没有语法上歧义的转义其实就是多此一举,增加数据交互的冗余工作。
楼主的这个 json 格式,如果场景是 Foo = {\"身份\":\"学生\",\"姓名\":\"张三\"},这时的转义其实是多余的。
而假设是 Foo = {"data": "{\"身份\":\"学生\",\"姓名\":\"张三\"}"},转义是需要的。
ipwx
2020-06-13 21:15:23 +08:00
@maobukui 。。。。 你们是认真的?谁在和你们说写代码的事情?

假设有个 JSON 存在文本文件里面,文件内容是:

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

这就根本不符合 JSON 标准啊。你读出来用啥库解析?怕不是当做 JS 执行一遍才行?
lagoon
2020-06-13 21:15:25 +08:00
@FutherAll 其实,我估计实际是\\\,所以最终还是保留了\
lagoon
2020-06-13 21:15:50 +08:00
@ipwx 但他们确认,这就是符合 json 规范的。。。吵翻了
lagoon
2020-06-13 21:19:07 +08:00
@ipwx 不,他们觉得转义合情合理。
争论,他们的办法是:
一,直接字符串,var = {\"身份\":\"学生\",\"姓名\":\"张三\"}; 这样实际字符串就没有\了。 可以转。
二、经过几道转换,然后把\转没了,然后再转 json 。论证没问题。
ipwx
2020-06-13 21:24:04 +08:00
@lagoon 对啊,评论区就有这种奇葩评论。我也是醉了。
lagoon
2020-06-13 21:27:30 +08:00
@Trim21 先把其他的转了,然后再把这个处理一下,再转。

没办法。。。。
ralu
2020-06-13 21:44:47 +08:00
https://gist.github.com/Muscipular/24674f3f05b6729bb66470528387ad58
@lagoon
压根没毛病
json 原文

{
"code": 200,
"data": {
"specs": "[{\"name\":\"容量\",\"values\":[\"120G\",\"260G\"]},{\"name\":\"网络型号\",\"values\":[\"移动\",\"联通\",\"全网通\"]}]"
},
"message": "请求成功"
}
ETiV
2020-06-13 21:49:12 +08:00
亲,这边没什么好争议的:是你的小伙伴他们错了。

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

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

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

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

© 2021 V2EX