Rust自習(シリアライザ JsonFlex)
serdeと同じくJSONのシリアライザ。struct
定義不要だが取得が大変。
成果物
情報源
コード
クレート作成
cargo new jsonflex_0
Cargo.toml
[dependencies] json_flex = "*"
main.rs
#[warn(unused_imports)] use json_flex::{JFObject, Unwrap}; use std::collections::HashMap; fn main() { let array = json_flex::decode(r#"[1,2,3,4]"#.to_owned()); println!("{:?}", array); println!("{:?}", array.to_json()); let array = json_flex::decode(r#"["1","2","3","4"]"#.to_owned()); println!("{:?}", array[0].into_string()); println!("{:?}", array.to_json()); let obj = json_flex::decode(r#"{"k1": "text", "k2": 100}"#.to_owned()); println!("{:?}", obj); // println!("{:?}", obj.k1); // アクセスできず…… // println!("{:?}", obj.k2); // アクセスできず…… println!("{:?}", obj.into_hashmap()); if let Some(map) = obj.into_hashmap() { println!("{:?}", map); println!("{:?}", map.get("k1")); println!("{:?}", map.get("k2")); println!("{:?}", map.get("k1").unwrap().unwrap_string()); // "text" クォーテーションついたまま…… println!("{:?}", map.get("k2").unwrap().unwrap_i64()); // 1000 } println!("{:?}", obj.to_json()); }
cargo run
Array([Integer(1), Integer(2), Integer(3), Integer(4)]) "[1,2,3,4]" Some("1") "[\"1\",\"2\",\"3\",\"4\"]" Dictionary({"k2": Integer(100), "k1": String("text")}) Some({"k2": Integer(100), "k1": String("text")}) {"k2": Integer(100), "k1": String("text")} Some(String("text")) Some(Integer(100)) "text" 100 "{\"k2\":100,\"k1\":\"text\"}"
{ k1: "text", k2: 100 }
期待
obj.k1
実態
obj.into_hashmap().get("k1").unwrap().unwrap_string()
- 長すぎィ! 入れ子になったらどうなっちゃうの……。
String(T)
なのにunwrap_string
なのが冗長。もっと短くできないものか……。- 取得値
"text"
ってクォート付いたままじゃん……
所感
serdeみたく構造体を定義せずにできるのは良い。だが、アクセスするときが非常に大変。
どちらにせよ、Rust言語の特徴から、どうしても冗長になってしまう。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- rustc 1.36.0 (a53f9df32 2019-07-03)
- cargo 1.36.0 (c4fcfb725 2019-05-15)
$ uname -a Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux
前回まで
- Rust学習まとめ(ドキュメント)
- Rust自習(じゃんけんゲーム1)
- Rust自習(双方向リスト1)
- Rust自習(単方向リスト1)
- Rust自習(単方向リスト2)
- Rust自習(単方向リスト3)
- Rust自習(単方向リスト4)
- Rust自習(単方向リスト5)
- Rust自習(単方向リスト6)
- Rust自習(単方向リスト7)
- Rust自習(リストのインタフェースを考える)
- Rust自習(連結リスト1)
- Rust自習(連結リスト2)
- Rust自習(連結リスト3)
- Rust自習(連結リスト4)
- Rust自習(連結リストの取得系インタフェース考察)
- Rust自習(連結リスト5)
- Rust自習(連結リストの取得系インタフェース考察2)
- Rust自習(連結リスト6)
- Rust自習(連結リスト7)
- Rust自習(連結リスト8)
- Rust自習(連結リスト9)
- Rust自習(変数名でイテレートする方法)
- Rust自習(iter、iter_mut実装方法)
- Rust自習(連結リスト10)
- Rust自習(rev()実装できず)
- Rust自習(cycle()実装できず)
- Rust自習(じゃんけんゲーム2)
- Rust自習(じゃんけんゲーム3)
- Rust自習(じゃんけんゲーム4)
- Rust自習(じゃんけんゲーム5)
- Rust自習(じゃんけんゲーム6)
- Rust自習(じゃんけんゲーム7)
- Rust自習(じゃんけんゲーム8)
- Rustのアップデート(rustup update)
- Rust自習(SQLite3 1)
- Rust自習(SQLite3 2)
- Rust自習(SQLite3 3)
- Rust自習(日時 1 chrono)
- Rust自習(日時 2 chrono)
- Rust自習(日時 3 chrono)
- Rust自習(日時 4 chrono)
- Rust自習(日時 5 chrono)
- Rust自習(日時 6 chrono)
- Rust自習(日時 7 chrono)
- Rust自習(std::time::SystemTime)
- Rust自習(std::time::Instant)
- Rust自習(std::time::Duration)
- Rust自習(シリアライズ serde 1)
- JSON5とは?
- Rust自習(シリアライズ serde 2 JSON5)
- Rust自習(シリアライズ serde 3 chrono日時型変換)
- Rust自習(diesel 1 SQLite3 ORM)
- Rust自習(diesel 2 SQLite3 ORM)
- Rust自習(diesel 3 SQLite3 ORM)
- Rust自習(diesel 4 SQLite3 ORM)
- Rust自習(diesel 5 SQLite3 ORM)
- Rust自習(diesel 6 SQLite3 ORM)
- Rust自習(diesel 7 SQLite3 ORM serde,chrono)
- Rust自習(diesel 8 SQLite3 ORM serde,chrono)
- Rustで正規表現(regex 1)
- Rustで正規表現(regex 2)
- Rustで正規表現(regex 3)
- Rustで正規表現(regex 4)
- Rustで正規表現(regex 5)
- Rust自習(人称辞典 1)
- Rust自習(人称辞典 2)
- Rust自習(人称辞典 3)
- Rust自習(人称辞典 4)
- Rust自習(人称辞典 5)
- SQLite3の列からCSVデータを抽出するならLIKEよりGLOBのほうが速いらしい
- Rust自習(人称辞典 6)