在不反序列化的情况下操作 JSON

Posted

技术标签:

【中文标题】在不反序列化的情况下操作 JSON【英文标题】:Manipulate JSON without deserializing it 【发布时间】:2019-09-15 22:04:33 【问题描述】:

aiohttp 应用程序从外部资源获取 JSON,并需要使用它来执行另一个请求,并将 JSON 作为请求正文传递。

为了避免序列化/反序列化开销 ujson 被使用,然后 JSON 对象被传递以在后续请求中使用,而无需加载或转储。这可行,但无法以这种方式操作 JSON,只能转发。

可能没有反序列化就无法操作它,但由于使用了ujson,因此首先将对象反序列化为C对象。考虑到这一点,有没有一种方法可以在 C 级别继续操作该对象,而无需将其作为 Python 字典。一个示例操作是从 JSON 中删除键或使用原始 JSON 的一个子集创建一个新的 JSON。或者检查这个 JSON 中是否存在给定的键。

【问题讨论】:

如果您根本不操作 JSON,我不明白您为什么要使用 JSON 解析器 ujson。只需将其作为不透明字符串传递...?!但是,是的,如果您想在不完全取消/序列化它的情况下操作 JSON,那么流式 JSON 解析器/编码器可能就是答案;当您通过它进行流式传输时,您只需省略输出某些部分。但不能特别推荐任何东西。 @deceze 对令人困惑的声明感到抱歉,ujson 在不序列化/反序列化 JSON 对象时毫无用处,它可用于探索 JSON 操作。但问题是,当使用 loads/dumps 时,我失去了 ujson C 实现将整个对象放入 Python 字典的所有性能优势。我想留在 C 级别进行操作。 【参考方案1】:

这可能会对您有所帮助:https://github.com/lemire/simdjson

我不完全理解用例,但它是一个旨在

我们提供快速解析器,可根据各种规范全面验证输入。解析器构建了一个有用的不可变(只读)DOM(文档对象模型),以后可以访问它。

它有点具体,它需要具有某些技术和特定编译器的 CPU,但在我看来它可能适合您的用例。

它还具有其他语言的包装器,包括 python。

【讨论】:

这很适合我的用例。尽管不能完全保持 C 级别的操作,但我可以将 JSON 的一小部分作为 Python 对象,避免反序列化整个 JSON,如 Python API 示例 github.com/TkTech/pysimdjson#example 所示

以上是关于在不反序列化的情况下操作 JSON的主要内容,如果未能解决你的问题,请参考以下文章

Golang如何不反序列化为前提的情况下,修改ProtoBuffer某个Tag的值

有啥简单的方法可以在不进行反序列化的情况下从 json 中找出最低值 c#

如何让 Json.Net 在不忽略子属性的情况下从 documentDB 序列化/反序列化动态/通用对象?

JSON.net:如何在不使用默认构造函数的情况下反序列化?

请问SAP为啥不能控制:已经审批的采购申请,在不反审批的情况下,可以被删除?

如何在不反编译的情况下更改已编译的 .class 文件?