筆者について
name → Koki Teramoto
age → 19
language → ja_JP, en_US
本編
昨日、以下の記事を公開しました。
この時に一気にTOONまでやっちゃおうと思ったのですが、僕の技術力不足でできませんでしたので本日やってしまいたいと思います。
使用クレート
使用するものは、以下のクレートです。
+ toon = "0.1.2"
メインコード
ということで、いざコーディング!
use serde::{Deserialize, Serialize};
use serde_json::json;
use std::fs;
use std::io::Write;
use toon::encode;
#[derive(Serialize, Deserialize, Debug)]
struct Todo {
#[serde(rename = "userId")]
user_id: i32,
id: i32,
title: String,
completed: bool,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
//Get the data
let body = reqwest::get("https://jsonplaceholder.typicode.com/todos")
.await?
.text()
.await?;
// Deserialize
let value: Vec<Todo> = serde_json::from_str(&body)?;
// Save as JSON
let mut file_json = fs::File::create("./todo.json")?;
file_json.write_all(body.as_bytes())?;
// Save as TOON
let data = json!(value);
let toon_output = encode(&data, None);
let mut file_toon = fs::File::create("./todo.toon")?;
file_toon.write_all(toon_output.as_bytes())?;
Ok(())
}
いくつか、詳細解説を以下載せます。
Rustのスネーク方式に表示を変える
Rustはスネーク方式を好むようです。ちなみに、元のJSONは以下のものです。
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
}
このうちのuserIdをスネーク方式に変更するために、#[serde(rename = "userId")]があるそうです。
そもそもこの取得してるデータなんやねん問題
ということで、データ元です。
なんかAPIのデモ用に用意されて要るっぽいです。便利ですね~!
TOONに変換してるところ
ということで、ひたすら蛇足を書いてまいりましたが、TOONに変換しているポイントは以下のみです。
let data = json!(value);
let toon_output = encode(&data, None);
用は、エンコードする(encode())のに&serde_json::Valueを引数に、そして2つ目の引数にオプションを指定するそうです。
ちなみにデータサイズ問題
ということで、結果から言うというかのとおりですね。
eza -lh
Permissions Size User Date Modified Name
.rw-r--r-- 24k koki 7 Dec 13:44 todo.json
.rw-r--r-- 11k koki 7 Dec 13:44 todo.toon
なんと、2倍近くもデータ量に差がでるということで、これは驚きでした。
最後に
今回はTOONにJSONから変換するプログラムをRustで作ってみました。日本の文献があまり多くはなさそうだったので、これからTOONを使う方々に届くことを願っております(そもそもRustでTOONを使う人がめっちゃ少ない説はある)。
ちなみに、TOON事態について知りたい人がいれば、下の記事が見やすかったのでぜひ。