Как я могу использовать serde json для объекта json с именами переменных переменных - PullRequest
0 голосов
/ 04 октября 2019

Мне известно о значении JSON, которое можно использовать для неизвестного JSON.

У меня есть в основном структурированный объект JSON, подобный следующему:

{
    "error": [],
    "result": {
        "NAME_X": {
            "prop_one": "something",
            "prop_two": "something",
            "decimals": 1,
            "more_decimals": 2
        },
        "NAME_A": {
            "prop_one": "test",
            "prop_two": "sdfsdf",
            "decimals": 2,
            "more_decimals": 5
        },
        "ARBITRARY": {
            "prop_one": "something else",
            "prop_two": "blah",
            "decimals": 3,
            "more_decimals": 6
        }
}

Итак, внутренний объект сПоля prop_one, prop_two, decimals и more_decimals имеют четкую структуру, но поле / ключ внешнего имени (NAME_X, NAME_A, ARBITRARY) заранее неизвестно.

Какой самый простой способ разобрать это, так что яможно использовать строго типизированные переменные / десериализацию на внутренней структуре? Мне также все еще нужно захватить эти неизвестные поля имени.

1 Ответ

1 голос
/ 04 октября 2019

Вы можете десериализовать в карту, ключи которой будут строками ("NAME_X" и т. Д.):

use std::collections::HashMap;
use serde::Deserialize;
use serde_json::Result;

#[derive(Debug, Deserialize)]
struct InThing {
    prop_one: String,
    prop_two: String,
    decimals: u16,
    more_decimals: i32,
}
#[derive(Debug, Deserialize)]
struct OutThing {
    error: Vec<u8>,
    result: HashMap<String, InThing>,
}

fn main() {
    let data = r#"
        {
            "error": [],
            "result": {
                "NAME_X": {
                    "prop_one": "something",
                    "prop_two": "something",
                    "decimals": 1,
                    "more_decimals": 2
                },
                "NAME_A": {
                    "prop_one": "test",
                    "prop_two": "sdfsdf",
                    "decimals": 2,
                    "more_decimals": 5
                },
                "ARBITRARY": {
                    "prop_one": "something else",
                    "prop_two": "blah",
                    "decimals": 3,
                    "more_decimals": 6
                }
            }
        }
        "#;
    let thing: OutThing = serde_json::from_str(data).unwrap(); 
    dbg!(thing);
}

детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...