2017-09-06 1 views
4

Je suis coincé, ci-dessous est le JSON que je reçois:l'analyse d'un objet à l'intérieur d'un objet avec serde_json

{ 
    "BCH": { 
     "aclass": "currency", 
     "altname": "BCH", 
     "decimals": 10, 
     "display_decimals": 5 
    } 
} 

Je suis peu confus sur la façon dont mon struct devrait ressembler à analyser les attributs à l'aide de la caisse serde_json . Ci-dessous ce que j'ai actuellement:

#[derive(Deserialize, Debug)] 
struct Assets { 
    aclass: String, 
    altname: String, 
    decimals: u8, 
    display_decimals: u8, 
} 

#[derive(Deserialize, Debug)] 
struct Currency { 
    assest: Assets, 
} 


fn to_assets_type(value: serde_json::Value) -> Currency { 
serde_json::from_value(value).unwrap() 
} 

Je reçois un message d'erreur:

fil

'main' paniqué à « appelé Result::unwrap() sur une Err valeur: ErrorImpl {code: Message (" manquant champ assest «), ligne: 0, colonne: 0} », src/libcore/result.rs: 860: 4

+1

On dirait que votre 'json' est un objet à l'intérieur d'un objet .... – Malice

+0

Je ne peux pas tester mon intuition, mais je pense que vous devriez essayer de renommer votre champ d'actifs' Currency' à 'BCH'. – Boiethios

+0

BCH n'est pas statique – BalaB

Répondre

6

Je pense que vous voulez un HashMap.

#[macro_use] extern crate serde; 
extern crate serde_json; 

use std::collections::HashMap; 

static VALUE: &str = r#"{ 
    "BCH": { 
     "aclass": "currency", 
     "altname": "BCH", 
     "decimals": 10, 
     "display_decimals": 5 
    } 
}"#; 

#[derive(Deserialize, Debug)] 
struct Assets { 
    aclass: String, 
    altname: String, 
    decimals: u8, 
    display_decimals: u8, 
} 

fn main() { 
    let serde_value: HashMap<String, Assets> = serde_json::from_str(VALUE).unwrap(); 

    println!("{:?}", serde_value); 
} 

playground

+0

Merci beaucoup mon ami, ça a bien fonctionné. :) – BalaB