当前位置: 首页 > 知识库问答 >
问题:

java - json 协议有规定连续两次序列化一个对象应该怎么样吗?

丌官玺
2024-01-06

json 协议有规定连续两次序列化一个对象应该怎么样吗?

子问题:

  • python 如果反序列化一个「连续两次序列化后的字符串」
  • java 如果反序列化一个「连续两次序列化后的字符串」

有一个 python 的 dict

content = {    'name': '你好'}

我调用两次 json.dumps()

import jsoncontent = {    'name': '你好'}print(json.dumps(json.dumps(content)))

输出如下

"{\"name\": \"\\u4f60\\u597d\"}"

然后我调用两次 json.loads,这个「被连续两次序列化后的字符串」就会变回 dict

import jsoncontent = {    '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 这些语言又是怎么处理这个问题呢?

共有4个答案

戎元忠
2024-01-06
json 协议有规定连续两次序列化一个对象应该怎么样吗?

没有,也不需要,就是简单的套娃,套娃几次拆几次就回去了

无法「简单」实现「把上面的字符串连续两次反序列化变成一个 hashmap」

不能说很麻烦但是也不简单,起码框架自己没这功能给反序列化两次,但是自己写也就一行的事情
顺便吐槽一句,随便飞 hashmap 的 java 农都应该去写 php

楚帅
2024-01-06

1、一定要序列化两次吗,一次不就是一个 json string了吗?
2、如果一定要序列化两次,那第二次的结果其实就是一个string了,把里面的 \" 全部替换成 ",再解析就可以了

侯和惬
2024-01-06

一次序列化的结果是 string ,两次序列化不过就是把 string 根据 json 序列化 string 的规则又序列化了一遍。

对于 Java 这一个强类型语言来说,表示 Json 这个各种类型混合的对象本身就是一件很麻烦的事情。所以不论你是一次序列化还是两次,都有很多麻烦事要搞。

万俟飞语
2024-01-06

问题:json 协议有规定连续两次序列化一个对象应该怎么样吗?

答案:JSON 协议本身并没有规定连续两次序列化一个对象应该如何处理。然而,不同的编程语言和库可能会有自己的实现方式。

对于 Python,你可以使用 json.dumps()json.loads() 方法进行序列化和反序列化操作。如果你连续两次调用 json.dumps(),实际上会先将对象序列化为一个字符串,然后再将这个字符串序列化为一个新的 JSON 对象。这样会使得结果字符串包含了一个嵌套的 JSON 对象,而不是一个简单的 JSON 字符串。

对于 Java,情况则有所不同。Java 的 GsonJackson 等库通常只支持一次序列化和反序列化操作。如果你尝试连续两次进行序列化或反序列化,可能会遇到问题,因为这些库可能无法正确解析嵌套的 JSON 对象。

要解决这个问题,你可以选择一种适合你的编程语言和库的方法来处理连续的序列化和反序列化操作。在 Python 中,你可以使用 json.loads() 来将嵌套的 JSON 对象转换为 Python 字典。在 Java 中,你可以使用一个支持嵌套 JSON 对象的库或自定义解析器来处理连续的序列化和反序列化操作。

至于其他编程语言(如 Golang 和 Rust)的处理方式,具体情况可能会有所不同,但一般来说,这些语言也提供了类似 Python 和 Java 的序列化和反序列化库或函数。对于连续的序列化和反序列化操作,你需要查阅相关语言的文档或库的文档,以了解具体的实现方式和注意事项。

 类似资料:
  • SOFARPC 可以在使用 Bolt 通信协议的情况下,可以选择不同的序列化协议,目前支持 hessian2 和 protobuf。 默认的情况下,SOFARPC 使用 hessian2 作为序列化协议,如果需要将序列化协议设置成 protobuf,在发布服务的时候,需要做如下的设置: <sofa:service ref="sampleService" interface="com.alipay.

  • 这就是我想要实现的: > 在Proc#1中使用google协议缓冲区建模对象 使用proto-buf序列化该对象,并将其发送到posix消息队列。 在Proc#2中读取流并将其反序列化为类似的模型,同时使用协议缓冲区。 换句话说: 进程1中的对象-- 问题是Proc#1和Proc#2可能是完全不同的语言平台。程序#1通常是C与g相一致的。但是Proc#2可以是任何东西:Python、Java等等。

  • 有没有办法将一般对象序列化为Json并将Json反序列化为对象<如果对象是一个实体,我可以使用Jackson 2库来实现这个目的<但是如果对象是一个普通类,我该怎么做呢? 例如,我想序列化com.datastax.driver.core.querybuilder。将更新为Json并保存到DB,然后搜索并反序列化它以更新对象,最后将其用作com.datastax.driver.core.Sessio

  • 问题内容: 我有两个具有相同结构的JSON对象,我想使用Javascript将它们连接在一起。是否有捷径可寻? 问题答案: 根据注释中的描述,您只需执行一个数组concat:

  • 我尝试反序列化json: 我有两个实体: 和 如何使用一个json条目同时反序列化两个实体?以下是使用Jackson ObjectMapper的main摘录: 它解析日期、uuid和数据集,但不能解析具有hmm_subfamily、hmm_evalue和hmm_score值的HmmResult对象:我得到错误:p.getHmmResult():null。(HmmResult hm=ObjMappe

  • 问题内容: 我想知道如何让Jackson JSON库将JSON反序列化为现有对象?我试图找到如何做到这一点。但它似乎只能接受一个Class并实例化它本身。 或者,如果不可能,我想知道是否有任何Java JSON反序列化库都可以做到。 对于C#,这似乎是一个相应的问题:将数据从JSON字符串覆盖到现有对象实例。似乎JSON.NET具有PopulateObject(string,object)。 问题