1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RustでJSON取得したままTOONも取得してみた

Posted at

筆者について

name → Koki Teramoto
age → 19
language → ja_JP, en_US

本編

昨日、以下の記事を公開しました。

この時に一気にTOONまでやっちゃおうと思ったのですが、僕の技術力不足でできませんでしたので本日やってしまいたいと思います。

使用クレート

使用するものは、以下のクレートです。

Cargo.toml
+ 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は以下のものです。

todo.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事態について知りたい人がいれば、下の記事が見やすかったのでぜひ。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?