やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

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言語の特徴から、どうしても冗長になってしまう。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux

前回まで