Есть ли способ десериализации произвольного JSON с использованием Serde без создания детализированных объектов?
У меня есть объект 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"));
}
1 ответ
Это было добавлено в 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"));
}