json 协议有规定连续两次序列化一个对象应该怎么样吗?
子问题:
- python 如果反序列化一个「连续两次序列化后的字符串」
- java 如果反序列化一个「连续两次序列化后的字符串」
有一个 python 的 dict
content = {
'name': '你好'
}
我调用两次 json.dumps()
import json
content = {
'name': '你好'
}
print(json.dumps(json.dumps(content)))
输出如下
"{\"name\": \"\\u4f60\\u597d\"}"
然后我调用两次 json.loads,这个「被连续两次序列化后的字符串」就会变回 dict
import json
content = {
'name': '你好'
}
print(json.dumps(json.dumps(content)))
a = json.dumps(json.dumps(content))
print(json.loads(json.loads(a)))
输出如下:
"{\"name\": \"\\u4f60\\u597d\"}"
{'name': '你好'}
一切都非常的优雅
但是当我 python 把 "{\"name\": \"\\u4f60\\u597d\"}"
传递给 java 同事的时候,他们告诉我,他们无法「简单」实现「把上面的字符串连续两次反序列化变成一个 hashmap」,他们说如果要反序列化成 hashmap 怎么怎么麻烦
我不理解,这么成熟的编程语言 java 为什么不能简单优雅的实现这一点?
我把这个需求「使用 java 反序列化 "{\"name\": \"\\u4f60\\u597d\"}"
为 hashmap」问 chatGPT,它给的答案也是莫名其妙
为什么?是 java 的问题还是说 json 的协议就对于「连续两次序列化」没有做出标准规定导致不同编程语言自己有自己的实现?
有谁知道,像 golang 和 rust、js 这些语言又是怎么处理这个问题呢?
一次序列化的结果是 string ,两次序列化不过就是把 string 根据 json 序列化 string 的规则又序列化了一遍。
对于 Java 这一个强类型语言来说,表示 Json 这个各种类型混合的对象本身就是一件很麻烦的事情。所以不论你是一次序列化还是两次,都有很多麻烦事要搞。