问题标签 [serde-json]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
json - 如何解析字符串或对象的 JSON 数组?
我遇到的一个 API 的 JSON 结构很差。有人认为发回如下所示的列表是个好主意
我已经想出了一种将这些数据放入结构中的方法,但这很有效:
这无助于我规范化和验证数据。
有没有一种好方法可以将第一个对象变成类似的东西
我看到type_name可能可用于检查类型并在它被解析后进行后处理serde_json
,但我也看到这type_name
是出于诊断目的,所以我不想将其用于此目的。
rust - 将对象转换为 serde_json::Value 而不进行序列化和反序列化
我有这个结构,它有一个包含类型的字段Option<serde_json::Value>
我希望能够在该字段中存储任何对象(即由任何结构创建的对象)。我正在使用的当前方法是首先将对象转换为 JSON 字符串(使用serde_json::to_string
),然后再将其转换为serde_json::Value
使用serde_json::from_str
。
我这样做是为了可以发送带有任意数据的不同类型的 JSON 请求。
那么,有没有办法将任何 serde-serializable 对象转换为serde_json::Value
不执行serde_json::to_string
and serde_json::from_str
?如果我走错了路,请推荐一个更好的,ty!
rust - 如何使用 serde_json 从 JSON 数组中流式传输元素?
我有一个 5GB JSON 文件,它是一组具有固定结构的对象:
我知道我可以尝试使用如何使用 Serde 使用顶级数组反序列化 JSON?:
有多个问题:
- 首先将其作为一个整体读取
- 读取为字符串后,它将其转换为
User
结构向量(我不想要那个)
我尝试了如何从 Rust 中的文件/流中懒惰地读取多个 JSON 值?但它会在打印任何内容之前读取整个文件,并在循环内一次打印整个结构。我期待在循环中一次一个对象:
理想情况下,(解析的)用户对象的解析和处理应该在两个单独的线程/任务/例程中同时发生或通过使用通道发生。
json - 从 serde_json 中的无类型 JSON 中提取数据时如何处理错误?
我有一个serde_json::Value
我希望包含一个对象数组的对象。从这些对象中,我想提取 2 个值并在任何失败时返回错误。到目前为止,这是我的代码:
当我使用.unwrap()
它时效果很好,但是在将返回类型更改为Result
并将 unwraps 替换为之后,?
我得到了以下编译错误:
我事先不知道 JSON 的确切结构,因此无法将其解析为结构。我所知道的是,它很可能是一个包含name
字符串字段和stock
整数字段的对象数组,我想将它们提取到地图中。如果情况并非如此,那么我想返回一个错误。最简单的方法是什么?
更新:在遵循 Lagerbaer 的建议并进行一些挖掘后,我想出了以下解决方案。
用于ok_or()
映射Option
到Result
,必须使用anyhow!
宏使其与无论如何结果类型兼容。事实还证明,它collect()
实际上接受了一个迭代器
Result<(String, u32)>
来生成Result<HashMap<String, u32>>
具有我想要的确切行为的 a,也就是说,如果没有错误,则返回第一个错误或完整的哈希映射。
rust - 通过 serde 捕获原始有效载荷
我想知道是否有办法使用 serde_json 保留原始字符串?考虑这个例子:
我的结构最终会包含这样的值:
目前,我通过反序列化为Value,然后将此值反序列化到User
结构中并将 Value 分配给该raw
字段来做到这一点,但这似乎不对,也许有更好的方法吗?
rust - 在 rust 中,将带有可选参数的平面 JSON 反序列化为嵌套结构和枚举
我正在尝试反序列化一些 JSON:{"id":1,"status":"Failed","cause":"Error"}
其中状态可以是“正在执行”、“成功”或“失败”之一,我的问题是,如果状态为“失败”,我只会得到“原因”。
我不希望原因成为原因,Option<String>
因为如果状态为“失败”,我总是会得到原因,而如果状态是“正在执行”或“成功”,我永远不会得到原因。我宁愿有类似的东西:
在上面的代码片段中,所有 status_from 测试都通过了,而 download_from 测试失败了。如果我#[serde(tag = "status")]
从状态中删除属性,那么只有 download_from_executing 和 download_from_succeeded 通过。
我只关心能够反序列化下载结构。
当我有一个状态为“失败”和原因的 JSON 主体时,我想找到正确的 serde 属性集来反序列化下载结构。
我的货物.toml:
rust - 您可以从映射或字符串反序列化结构吗?
考虑这个Config
包含结构向量的Host
结构:
使用派生的Deserialize
实现,可以使用serde_json
和成功反序列化以下 JSON 和 YAML 配置文件serde_yaml
:
但是,我还希望能够Host
从字符串反序列化结构。但是,重要的是我还可以从地图反序列化它,理想情况下,矢量可以由两种格式组成。例如:
在结构#[serde(try_from = "String")]
之上Host
,我可以轻松地支持字符串反序列化......但是它不再反序列化地图格式。
serde 网站有一个关于反序列化字符串或结构的页面deserialize_with
,但它需要只能应用于字段(而不是结构容器)的属性。我不确定这种技术是否可行,因为我的领域是 aVec<Host>
而不仅仅是 a Host
。
这有可能实现吗?
rust - 如何在匹配臂中表达变量类型?
serde_json
我正在尝试使用Rust解析一段 json 字符串。我想使用以下语法匹配解析的结果:
但是编译器向我抱怨他不知道的类型,result
当然,他是对的。但是我怎么能告诉他的类型result
呢?我尝试了以下代码,但它也没有工作。所以我想在匹配臂中表达变量的类型。