例如:
{"a": "数据 1", "b": ["测试 1", "测试 2"]}
这样的数据转为一个字符串,对于多数语言通用,且各个语言转化的字符串相等,最好是可逆的。
1
lihongjie0209 2018-05-08 10:28:51 +08:00
举个反例我看看哪里不相等.
|
2
myyou OP @lihongjie0209 对于 {"a":1, "b":2} js 和 python 得到的 json 字符串不相等
|
3
myyou OP @lihongjie0209 所以我希望能把 json 数据转化为一个相等的字符串,并不一定是 json 字符串
|
4
ylcc 2018-05-08 10:35:34 +08:00
你确定得到的 json 字符串不一样么。。。
|
5
lihongjie0209 2018-05-08 10:39:19 +08:00
js:
obj = {"a":1, "b":2} {a: 1, b: 2} JSON.stringify(obj) "{"a":1,"b":2}" python: In [1]: obj = {"a": 1, "b": 2} In [2]: import json In [3]: s = json.dumps(obj) In [4]: print(s) {"a": 1, "b": 2} In [5]: @myyou 哪里不一样 |
6
myyou OP |
7
mulog 2018-05-08 10:51:18 +08:00
什么叫「 json 数据转换成对应的字符串」? json 数据不是字符串还能是啥。。。
我猜一下,你是想问: 有 json 字符串 s, 如何使得 dump_to_json(load_from_json(s)) === s, 对于所有语言? 这个我觉得主要是格式控制吧,比如 python:json.dumps(obj, separators=(',', ':')) 就没有空格了。 https://stackoverflow.com/questions/16311562/python-json-without-whitespaces |
8
lihongjie0209 2018-05-08 10:53:39 +08:00
@myyou #6 作为一个数据传输格式, 你没必要关注字符串是否一样, 只需要关注在转换在相应语言中的 map 或者对象的时候里面的数据是否一致就好了. 字符串只是信息的一种表达形式.
|
9
momocraft 2018-05-08 11:02:42 +08:00
json 不稳定的地方只有 object key 的顺序。在各语言用 json-stable-stringify (npm) 这样的库然后调到一致就行了。
|
12
Felldeadbird 2018-05-08 11:39:55 +08:00
不明白楼主遇到什么问题。
"b" : 1 "c" : "2" 前者肯定会是数字,后者肯定是字符串的。 难道楼主在开发的时候,1 转换过来成了字符串? |
13
ipwx 2018-05-08 11:43:30 +08:00
@lihongjie0209 @Felldeadbird
Python 3.0 的字典字面量是 OrderedDict,所以 iter({"a":..., "b":...}) 永远返回 ["a","b"] 这个顺序。 但是 json 反序列化得到的字典是 dict,iter(...) 顺序不固定。 其他语言我不懂,不过也许也存在这个问题。这就是楼主的困扰。Python 的解决方案我上面已经给出了。 @lihongjie0209 有时候比较 JSON 字符串是一种比较对象的快速方法。虽然 in general 不可靠,但是如果限定数据只有 ASCII 字符和整数,还是挺好用的。 |
14
VoidChen 2018-05-08 11:44:34 +08:00
你是在问序列化吗
|
15
ebingtel 2018-05-08 11:55:30 +08:00
不能……一是顺序不确定,而是有的加空格 有的不加
|
16
lihongjie0209 2018-05-08 12:22:51 +08:00
@ipwx #13 就 json 而言, 是没有顺序一说的, 至于 python 怎么实现那是 python 的问题, 只要保证里面数据一样就可以
|
17
myyou OP @Felldeadbird 不是我是希望无论是 python 还是 js 处理得到的 json 字符串,直接通过比较字符串是否相等就能判断两个 json 是否相等,应为我想把一组 json 字符串当做一个标签来用
|
18
momocraft 2018-05-08 13:19:17 +08:00
#9 的补充:想了想字符串 (的 escape) 也有可能不稳定。还是要测试。
|
19
lihongjie0209 2018-05-08 13:57:21 +08:00
@myyou #17 那你还不如用 mongodb 之类的文档数据库, 直接比较字符串是最不可取的方式
|
20
Felldeadbird 2018-05-08 15:18:54 +08:00
如果你直接拿到 JSON 字符串来比较,那么两边语言 在收到对方传递过来的 JSON 字符串,你不反序列化,直接比较就可以了。 除非你是 一边语言是传递 JSON 字符串,一边语言从数据库或其他地方取出验证 JSON。那么直接比较必然会存在差异的。
如果真的要比较,你需要在某一语言重组 JSON 结构顺序。 最近我有一个功能是 PHP 和 JS 的 JSON 比较,我是怎么实现是否一致的。 |
21
vimiix 2018-05-08 15:37:38 +08:00
为啥要比较 Json 字符串是否相等,json 字符串的大小太不可控了。
具体不知道你是什么应用,但可以考虑使用 MD5 验证是否一致 |
23
lolizeppelin 2018-05-08 15:53:30 +08:00 via Android
典型前端思路 怎么方便怎么来
不就是想直接拿 string 相等来判断么 |
24
srlp 2018-05-08 21:46:38 +08:00 via iPhone
序列化成字符串的时候把 key 排序、多余空格去掉、注释删掉即可,基本可以保证是相等的。
不过这种结构化的东西,本来就应该结构化地比较,用字符串来比较看起来不是正道。 |
25
srlp 2018-05-08 21:52:50 +08:00 via iPhone
另外,按照 key 排序这一点,不同编程语言的排序定义可能不一样,非 ascii 的字符怎么排这个也要定好,等等,还是有很多要注意的。
在可控的环境下可以考虑,要对任意情况下都能解决,对楼主来说可能有点困难了。 |
26
yzmm 2018-05-09 10:00:54 +08:00
json 只是数据格式,比较还得自己写转换,不能混为一谈吧。
|
29
mayorbryant 2018-05-09 11:15:04 +08:00
感觉你说的跟验签差不多,不管是 js 还是 Python 来的 json 数据,你要验证是否为同一个 string?那就在 js 和 Python 保持格式一致啊,不管是用 json.dumps 还是自己写一个方法,比如说按照 key 的升序以'key=value&'拼接
|
30
towl 2018-05-09 20:25:06 +08:00
没看明白是啥意思,看了评论,大概是找有序字典? 如果是这样的话,建议使用 python 内置模块 collections.OrderedDict
|
31
myyou OP @towl 不是有序字典,是希望不论哪种编程语言,通过一定算法把 json 转为一个字符串,通过比较字符串就能确认两个 json 是否相等
|