Есть ли способ десериализации произвольного 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"));
}
Другие вопросы по тегам