有没有办法让每一个 json 数据转为与之对应的字符串,而且对于 Python , Java 和 js 等语言都通用且转化的字符串也相等?

2018-05-08 10:25:27 +08:00
 myyou

例如:

{"a": "数据 1", "b": ["测试 1", "测试 2"]}

这样的数据转为一个字符串,对于多数语言通用,且各个语言转化的字符串相等,最好是可逆的。

3648 次点击
所在节点    Python
31 条回复
lihongjie0209
2018-05-08 10:28:51 +08:00
举个反例我看看哪里不相等.
myyou
2018-05-08 10:32:37 +08:00
@lihongjie0209 对于 {"a":1, "b":2} js 和 python 得到的 json 字符串不相等
myyou
2018-05-08 10:33:53 +08:00
@lihongjie0209 所以我希望能把 json 数据转化为一个相等的字符串,并不一定是 json 字符串
ylcc
2018-05-08 10:35:34 +08:00
你确定得到的 json 字符串不一样么。。。
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 哪里不一样
myyou
2018-05-08 10:48:52 +08:00
@ylcc
@lihongjie0209
好吧,我错了,那天测试是不一样的,可能是幻觉吧
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
lihongjie0209
2018-05-08 10:53:39 +08:00
@myyou #6 作为一个数据传输格式, 你没必要关注字符串是否一样, 只需要关注在转换在相应语言中的 map 或者对象的时候里面的数据是否一致就好了. 字符串只是信息的一种表达形式.
momocraft
2018-05-08 11:02:42 +08:00
json 不稳定的地方只有 object key 的顺序。在各语言用 json-stable-stringify (npm) 这样的库然后调到一致就行了。
myyou
2018-05-08 11:06:35 +08:00
@momocraft 对我就是希望 key 的顺序也一样
ipwx
2018-05-08 11:22:58 +08:00
@myyou Python: json.dumps(..., sort_keys=True)

JS 不知道,别问我。
Felldeadbird
2018-05-08 11:39:55 +08:00
不明白楼主遇到什么问题。
"b" : 1
"c" : "2"
前者肯定会是数字,后者肯定是字符串的。 难道楼主在开发的时候,1 转换过来成了字符串?
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 字符和整数,还是挺好用的。
VoidChen
2018-05-08 11:44:34 +08:00
你是在问序列化吗
ebingtel
2018-05-08 11:55:30 +08:00
不能……一是顺序不确定,而是有的加空格 有的不加
lihongjie0209
2018-05-08 12:22:51 +08:00
@ipwx #13 就 json 而言, 是没有顺序一说的, 至于 python 怎么实现那是 python 的问题, 只要保证里面数据一样就可以
myyou
2018-05-08 13:17:20 +08:00
@Felldeadbird 不是我是希望无论是 python 还是 js 处理得到的 json 字符串,直接通过比较字符串是否相等就能判断两个 json 是否相等,应为我想把一组 json 字符串当做一个标签来用
momocraft
2018-05-08 13:19:17 +08:00
#9 的补充:想了想字符串 (的 escape) 也有可能不稳定。还是要测试。
lihongjie0209
2018-05-08 13:57:21 +08:00
@myyou #17 那你还不如用 mongodb 之类的文档数据库, 直接比较字符串是最不可取的方式
Felldeadbird
2018-05-08 15:18:54 +08:00
如果你直接拿到 JSON 字符串来比较,那么两边语言 在收到对方传递过来的 JSON 字符串,你不反序列化,直接比较就可以了。 除非你是 一边语言是传递 JSON 字符串,一边语言从数据库或其他地方取出验证 JSON。那么直接比较必然会存在差异的。
如果真的要比较,你需要在某一语言重组 JSON 结构顺序。 最近我有一个功能是 PHP 和 JS 的 JSON 比较,我是怎么实现是否一致的。

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

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

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

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

© 2021 V2EX