再争论一个 json 转义的问题
这就是后台给的 json 原文,换种说法,也就是接口拿到的实际数据。嗯…甚至还有带和不带的混合双打。
众所周知这是转义,但我目前所知,dart,android 用的 gson,ios 都是无法直接将它转 json 对象的。需要先经过处理,把去掉。
但后台,一般觉得这是规范的 json 。
每次遇到这个问题,都吵的不可开交。
请大家评理。
真的心累,不知道实际该怎么看待。因为很常见,我转不了,但后台又非常生气,觉得肯定是没问题。
这就是后台给的 json 原文,换种说法,也就是接口拿到的实际数据。嗯…甚至还有带和不带的混合双打。
众所周知这是转义,但我目前所知,dart,android 用的 gson,ios 都是无法直接将它转 json 对象的。需要先经过处理,把去掉。
但后台,一般觉得这是规范的 json 。
每次遇到这个问题,都吵的不可开交。
请大家评理。
真的心累,不知道实际该怎么看待。因为很常见,我转不了,但后台又非常生气,觉得肯定是没问题。
比如
var a = “{“身份”:”学生”,”姓名”:”张三”}”
a 的内容是什么?
是 {“身份”:”学生”,”姓名”:”张三”}
上面 var a 后面的是为了把 JSON 表示成字符串而做的一层额外转义。变量内部是没有斜线的。
所以后台要么给
“{“身份”:”学生”,”姓名”:”张三”}”
也就是两次序列化,
要么给
{“身份”:”学生”,”姓名”:”张三”}
也就是一次序列化。
要不要试试先把它当 JSON String 而不是 JSON Object
https://i.loli.net/2020/06/13/WPlr4MVNJE7XxmZ.png
我的描述好像容易引起歧义,我重洗说一下 我还是直接写文本吧。
按道理来说,你可以在这个字符串外面再套一层就好理解了
{
“str”: “{“身份”:”学生”,”姓名”:”张三”}”
}
大意如上,服务器返回的内容被当作嵌套了一层 JSON String,这样再拿 str 字段出来的时候,就会处理掉转义了。
实际上大意和二是一致的,只是我不小心举了个错误的例子。
不是的,这样你断点看看 str,已经被转义了。json 处理时没有了
https://i.loli.net/2020/06/13/eE1zGyB2M9lUNoX.png
# -*- 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’
假设有个 JSON 存在文本文件里面,文件内容是:
{“身份”:”学生”,”姓名”:”张三”}
这就根本不符合 JSON 标准啊。你读出来用啥库解析?怕不是当做 JS 执行一遍才行?
没办法。。。。
一种情况是,后端拿到的时候就已经是 json 了,后端也不关心这个 json 的内部(可能是前端生成的配置),直接当一个对象的 string 属性,再把这个对象序列化后传给前端,没记错的话,记得奇妙清单就是这么干的
我理解这个接口是想返回这个对象,那应该返回不带转义的,不然就是序列化了两次.
正确的处理方法:在返回之前反序列化一次就可以了。Java+Mybatis 用 TypeHandler 转成 JsonNode 就行,Go 自己写一个类,其他的也类似。
争论的关键点在于这个是不是符合 json 规范的。特别是混合双打的情况下。
后端返回的是代码原文,得执行 eval 才能正确解析,这个风险肯定很高。这个返回值肯定不是用 json dump 的标准库处理得到的,太奇葩了