取得して処理する元の値(json)
Object {“currencySymbol”: Null, “id”: String(“likecoin”), “rateUsd”: String(“0.0009301600000000”), “symbol”: String(“LIKE”), “type”: String(“crypto”)}, Object {“currencySymbol”: String(“£”), “id”: String(“falkland-islands-pound”), “rateUsd”: String(“1.2207493203478160”), “symbol”: String(“FKP”), “type”: String(“fiat”)},….
構造体
#[derive(Debug, Serialize, Clone, Deserialize)] struct Rate { id: String, symbol: String, currencySymbol: String, r#type: String, rateUsd: String, }
これで、serde_json::from_valueで構造体Rateに入れようとすると
let mut coins = get_price().await.unwrap(); let objs: Vec<Rate> = serde_json::from_value(coins).unwrap(); for obj in objs { println!("{:?}", &obj); }
thread ‘main’ panicked at src/main.rs:17:57:
called `Result::unwrap()` on an `Err` value: Error(“invalid type: null, expected a string”, line: 0, column: 0)
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
構造体ではcurrencySymbolをStringで定義しているが、一部の値でNullが含まれているためエラーになってしまう…
Nullを空文字に置換できないか、構造体でString or Nullみたいな書き方はできないか、 など色々試行錯誤したが、いっそのこと
#[derive(Debug, Serialize, Clone, Deserialize)] struct Rate { id: String, symbol: String, // currencySymbol: String, r#type: String, rateUsd: String, }
currencySymbol自体を取らないとしたら、
$ cargo run
…
Rate { id: “salvadoran-colón”, symbol: “SVC”, type: “fiat”, rateUsd: “0.1137841148955581” }
Rate { id: “saint-helena-pound”, symbol: “SHP”, type: “fiat”, rateUsd: “1.2207493203478160” }
Rate { id: “haitian-gourde”, symbol: “HTG”, type: “fiat”, rateUsd: “0.0076549269176472” }
Rate { id: “bermudan-dollar”, symbol: “BMD”, type: “fiat”, rateUsd: “1.0000000000000000” }
Rate { id: “turkmenistani-manat”, symbol: “TMT”, type: “fiat”, rateUsd: “0.2857142857142857” }
Rate { id: “litecoin”, symbol: “LTC”, type: “crypto”, rateUsd: “104.0104020958773373” }
あれ、できるやん。つまり、元データから構造体で定義したデータだけ引っこ抜くということが可能だとわかった。
元データと一致していないといけないと思ったんだが、、、 なんのこっちゃ