Десериализовать пронумерованные элементы, используя serde - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь десериализовать JSON данные, которые выглядят следующим образом, используя serde:

{
  "item1": "Foo",
  "item2": "Bar",
  "item3": "Baz",
  "item4": null,
  "item5": null,
  "description1": "something",
  "description2": "another thing",
  "description3": "one more thing",
  "description4": null,
  "description5": null
}

Можно предположить, что есть только 5 элементов, и поля будут всегда присутствовать (но, возможно, нулевые ).

Я надеялся поместить его в Vec<Item>, где

struct Item {
    name: String,
    description: String,
}

Я знаю, что могу #[derive(Deserialize)] и псевдоним поля имени, но я не уверен как справиться с преобразованием пронумерованных элементов в список. Как можно go разобраться с таким случаем в serde?

1 Ответ

1 голос
/ 07 марта 2020

Рассмотрим serde_ json :: from_str для анализа в serde_json::Value, а затем примените преобразование, необходимое для вашего конкретного c варианта использования.

#[derive(Debug)]
struct Item {
    name: String,
    description: String,
}

fn main() {
    let data = r#"
    {
        "item1": "Foo",
        "item2": "Bar",
        "item4": null,
        "item5": null,
        "description1": "something",
        "description2": "another thing",
        "description3": "one more thing",
        "description4": null,
        "description5": null
    }"#;
    let v: Value = serde_json::from_str(data).unwrap();
    let mut items = Vec::new();

    for idx in 1..6 {
        let name = format!("item{}", idx);
        let descr = format!("description{}", idx);
        if let (Value::String(value), Value::String(descr)) = (&v[name], &v[descr]) {
            items.push(Item {
                name: value.to_string(),
                description: descr.to_string(),
            })
        }
    }

    println!("items {:?}", items);
}
...