Python中如何实现跨语言通用的JSON数据转字符串,确保Python、Java和JS转换结果一致?

例如:

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

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


Python中如何实现跨语言通用的JSON数据转字符串,确保Python、Java和JS转换结果一致?
29 回复

举个反例我看看哪里不相等.


核心问题:不同语言(Python/Java/JS)的JSON序列化默认行为不同,导致相同数据结构的字符串输出可能不一致(如空格、键排序、Unicode编码等)。

解决方案:统一使用严格的序列化参数,确保输出标准化。以下是Python的实现示例:

import json

def to_canonical_json(data):
    """
    生成跨语言一致的JSON字符串
    规则:
    1. 无空格缩进和分隔符
    2. 按键名排序(ASCII顺序)
    3. 非ASCII字符使用\u转义
    4. 禁止尾随逗号等非标准格式
    """
    return json.dumps(
        data,
        ensure_ascii=True,      # 强制转义非ASCII字符
        separators=(',', ':'),  # 移除空格(默认含空格)
        sort_keys=True,         # 键名排序
        indent=None             # 无缩进
    )

# 示例
data = {"b": 2, "a": "中文", "c": [1, 3, 2]}
json_str = to_canonical_json(data)
print(json_str)  
# 输出:{"a":"\u4e2d\u6587","b":2,"c":[1,3,2]}

其他语言对应配置

  • JavaScript
    JSON.stringify(data, Object.keys(data).sort())
    
  • Java(Jackson库示例):
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true);
    mapper.configure(JsonGenerator.Feature.ORDER_MAP_ENTRIES_BY_KEYS, true);
    String json = mapper.writeValueAsString(data);
    

一句话总结:统一序列化参数(键排序、无空格、强制ASCII转义)即可保证跨语言一致性。

对于 {“a”:1, “b”:2} js 和 python 得到的 json 字符串不相等

所以我希望能把 json 数据转化为一个相等的字符串,并不一定是 json 字符串

你确定得到的 json 字符串不一样么。。。

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]:



哪里不一样



好吧,我错了,那天测试是不一样的,可能是幻觉吧

什么叫「 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

#6 作为一个数据传输格式, 你没必要关注字符串是否一样, 只需要关注在转换在相应语言中的 map 或者对象的时候里面的数据是否一致就好了. 字符串只是信息的一种表达形式.

json 不稳定的地方只有 object key 的顺序。在各语言用 json-stable-stringify (npm) 这样的库然后调到一致就行了。

对我就是希望 key 的顺序也一样

Python: json.dumps(…, sort_keys=True)

JS 不知道,别问我。



Python 3.0 的字典字面量是 OrderedDict,所以 iter({“a”:…, “b”:…}) 永远返回 [“a”,“b”] 这个顺序。

但是 json 反序列化得到的字典是 dict,iter(…) 顺序不固定。

其他语言我不懂,不过也许也存在这个问题。这就是楼主的困扰。Python 的解决方案我上面已经给出了。

有时候比较 JSON 字符串是一种比较对象的快速方法。虽然 in general 不可靠,但是如果限定数据只有 ASCII 字符和整数,还是挺好用的。

你是在问序列化吗

不能……一是顺序不确定,而是有的加空格 有的不加

#13 就 json 而言, 是没有顺序一说的, 至于 python 怎么实现那是 python 的问题, 只要保证里面数据一样就可以

#9 的补充:想了想字符串 (的 escape) 也有可能不稳定。还是要测试。

#17 那你还不如用 mongodb 之类的文档数据库, 直接比较字符串是最不可取的方式

如果你直接拿到 JSON 字符串来比较,那么两边语言 在收到对方传递过来的 JSON 字符串,你不反序列化,直接比较就可以了。 除非你是 一边语言是传递 JSON 字符串,一边语言从数据库或其他地方取出验证 JSON。那么直接比较必然会存在差异的。
如果真的要比较,你需要在某一语言重组 JSON 结构顺序。 最近我有一个功能是 PHP 和 JS 的 JSON 比较,我是怎么实现是否一致的。

为啥要比较 Json 字符串是否相等,json 字符串的大小太不可控了。
具体不知道你是什么应用,但可以考虑使用 MD5 验证是否一致

3.6 之前的不是有序的,3.6 之后的才是有序的 而且以后可能变回无序

典型前端思路 怎么方便怎么来
不就是想直接拿 string 相等来判断么

序列化成字符串的时候把 key 排序、多余空格去掉、注释删掉即可,基本可以保证是相等的。

不过这种结构化的东西,本来就应该结构化地比较,用字符串来比较看起来不是正道。

另外,按照 key 排序这一点,不同编程语言的排序定义可能不一样,非 ascii 的字符怎么排这个也要定好,等等,还是有很多要注意的。

在可控的环境下可以考虑,要对任意情况下都能解决,对楼主来说可能有点困难了。

json 只是数据格式,比较还得自己写转换,不能混为一谈吧。

MD5 怎么校验?怎样把不同语言产生的 json 字符串生成相同 MD5 ?有没有办法没?

有没有好的转化方法没?

没看明白是啥意思,看了评论,大概是找有序字典? 如果是这样的话,建议使用 python 内置模块 collections.OrderedDict

不是有序字典,是希望不论哪种编程语言,通过一定算法把 json 转为一个字符串,通过比较字符串就能确认两个 json 是否相等

回到顶部