Десериализация различных структур данных с помощью ржавчины - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь десериализовать JSON, который получен из Web API и имеет неоправданно глубокую структуру.

С помощью serde можно ли десериализовать JSON как:

{
    "unnecessarily": {
        "deep": {
            "structure": {
                "data1": 0
            }
        }
    },
    "data2": 0
}

до ржавой структуры:

struct Data {
   data1: usize,
   data2: usize,
}

без ручной реализации Deserialize?

Если это невозможно, есть ли другие подходящие ящики?

1 Ответ

2 голосов
/ 08 апреля 2020

Вы можете использовать макрос derive serde для генерации реализаций черт Serialize и Deserialize

use serde::Deserialize;

#[derive(Deserialize)]
struct Data {
   data1: usize,
   data2: usize,
}

Если структура JSON заранее не известна Вы можете десериализовать до serde_json::Value и работать с этим

use serde_json::{Result, Value};
fn example() -> Result<()> {
    let data = r#"
        {
          "unnecessarily": {
            "deep": {
              "structure": {
                "data1": 0
              }
            }
          },
          "data2": 0
        }"#;

    let v: Value = serde_json::from_str(data)?;

    let data1 = v["unnecessarily"]["deep"]["structure"]["data1"].as_i64()?;

    Ok(())
}
...