有没有办法在不创建细粒度对象的情况下使用 Serde 反序列化任意 JSON?
Is there a way to deserialize arbitrary JSON using Serde without creating fine-grained objects?
我有一个 JSON 对象,其中包含一些元数据键和大量数据负载。我的服务出于日志记录和路由的目的关心元数据,但不关心负载,除非将负载传递给另一个服务。我永远不需要出于任何原因查看有效负载内部。
现在,有效负载在我的结构中表示为 serde_json::Value
。通过分析,我发现 Value
的(反)序列化花费了大量时间。
Serde 中是否有一种机制,我可以在其中捆绑有效负载,而不必支付将其反序列化为组件值的成本,而后需要重新序列化它们?
extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
#[derive(Serialize, Deserialize)]
struct DataBlob<'a> {
id: &'a str,
priority: u8,
// payload: OpaqueValue,
}
fn main() {
let input = r#"{
"id": "cat",
"priority": 42,
"payload": [1, 2, 3, 4]
}"#;
let parsed = serde_json::from_str::<DataBlob>(input).expect("Could not deserialize");
let output = serde_json::to_string(&parsed).expect("Could not serialize");
assert!(output.contains("payload"));
}
这是在 serde_json 1.0.29 中作为 RawValue
类型添加的。它必须使用 raw_value
功能启用,然后放在引用后面:
extern crate serde; // 1.0.79
#[macro_use]
extern crate serde_derive; // 1.0.79
extern crate serde_json; // 1.0.30, features = ["raw_value"]
#[derive(Serialize, Deserialize)]
struct DataBlob<'a> {
id: &'a str,
priority: u8,
payload: &'a serde_json::value::RawValue,
}
fn main() {
let input = r#"{
"id": "cat",
"priority": 42,
"payload": [1, 2, 3, 4]
}"#;
let parsed = serde_json::from_str::<DataBlob>(input).expect("Could not deserialize");
let output = serde_json::to_string(&parsed).expect("Could not serialize");
assert!(output.contains("payload"));
}
我有一个 JSON 对象,其中包含一些元数据键和大量数据负载。我的服务出于日志记录和路由的目的关心元数据,但不关心负载,除非将负载传递给另一个服务。我永远不需要出于任何原因查看有效负载内部。
现在,有效负载在我的结构中表示为 serde_json::Value
。通过分析,我发现 Value
的(反)序列化花费了大量时间。
Serde 中是否有一种机制,我可以在其中捆绑有效负载,而不必支付将其反序列化为组件值的成本,而后需要重新序列化它们?
extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
#[derive(Serialize, Deserialize)]
struct DataBlob<'a> {
id: &'a str,
priority: u8,
// payload: OpaqueValue,
}
fn main() {
let input = r#"{
"id": "cat",
"priority": 42,
"payload": [1, 2, 3, 4]
}"#;
let parsed = serde_json::from_str::<DataBlob>(input).expect("Could not deserialize");
let output = serde_json::to_string(&parsed).expect("Could not serialize");
assert!(output.contains("payload"));
}
这是在 serde_json 1.0.29 中作为 RawValue
类型添加的。它必须使用 raw_value
功能启用,然后放在引用后面:
extern crate serde; // 1.0.79
#[macro_use]
extern crate serde_derive; // 1.0.79
extern crate serde_json; // 1.0.30, features = ["raw_value"]
#[derive(Serialize, Deserialize)]
struct DataBlob<'a> {
id: &'a str,
priority: u8,
payload: &'a serde_json::value::RawValue,
}
fn main() {
let input = r#"{
"id": "cat",
"priority": 42,
"payload": [1, 2, 3, 4]
}"#;
let parsed = serde_json::from_str::<DataBlob>(input).expect("Could not deserialize");
let output = serde_json::to_string(&parsed).expect("Could not serialize");
assert!(output.contains("payload"));
}