コンテンツにスキップ

Json形式を使う#

はじめに#

今まで通信する際に送っていたのは「Hello, World!!」みたいな文章です。え?ロボットで使えるわけがなくない?

ということで送信するデータに工夫していきましょう。

Json形式#

今回はプログラムで用意した構造体をJson形式に変換するという手法をとります。json形式とはJavaScript Object NotationというJavaScriptという言語におけるオブジェクトの定義の仕方を参考にした定義です。なんとRustにはこれらの変換を簡単に行えるクレート(ライブラリみたいなもん)があるので活用していきましょう。

SerdeとSerde_json#

おそらく「さーでぃ」って読むと思います。Serdeとserde_json、これらのクレートを用いて実装していきます。クレートのリンクは以下になります。

serde - Rust

serde_json 0.8.6

Cargo.tomlの設定#

[dependencies]
serde = {version = "1.0.195", features = ["derive"]}
serde_json = "1.0"

詳しい書き方はわからないです。コピペしてそういうものなんだなって思ってます。

実装#

構造体の作成#

まずメッセージとなる構造体を定義します。今回はMessageという名前の構造体で人の名前、年齢、好きな数字を入れる構造体にしました。

use serde::{Serialize, Deserialize};
use serde_json;

#[derive(Serialize, Deserialize)]
pub struct Message
{
    pub name:String,
    pub age:i32,
    pub favorite_number:f32
}

useで外部クレートを持ってくるのはいつも通りですね。 構造体の上になにやら#[derive(Serialize, Deserialize)]というものが書いてます。今回はここが一番のミソです。 deriveというものは「派生」という意味を指す英語で、serdeに実装されたSerialize(構造体を文字列に変換)する機能とDeserialize(文字列を構造体に変換)する機能を好きな構造体に派生させてます。要するにこれをつけることでMessage構造体を変換できるようになったんですね。

構造体をメッセージに変換する#

それでは使っていきましょう。

use serde::{Serialize, Deserialize};
use serde_json;

#[derive(Serialize, Deserialize)]
pub struct Message
{
    pub name:String,
    pub age:i32,
    pub favorite_number:f32
}

fn main()
{
    let msg = Message{
        name:"Motii".to_string(),
        age:18
        favorite_number:123.456
    };

    let serialized_msg = serde_json::to_string(&msg).unwrap();

    println!("Serialized :{}", serialized_msg);
}

これを実行すると以下のように出ます。

Serialized:{"name":"Motii","age":18,"favorite_number":123.456}

Rustprintln!()関数はその文字列を出力したあと、自動で改行も出力してくれるすぐれものです。 {}はC言語でいう%dみたいなもので、変数の中身を出力します。

まず構造体の中身を設定し、serde_jsonの関数を用いて変換を行いました。 ここで最初の#[derive]の文を書いてないとエラーがでてしまうので注意してください。

メッセージを構造体に変換する。#

以下のような感じです。

use serde::{Serialize, Deserialize};
use serde_json;

#[derive(Serialize, Deserialize)]
pub struct Message
{
    pub name:String,
    pub age:i32,
    pub favorite_number:f32
}

fn main()
{
    let msg = Message{
        name:"Motii".to_string(),
        age:18
        favorite_number:123.456
    };

    let serialized_msg = serde_json::to_string(&msg).unwrap();

    println!("Serialized :{}", serialized_msg);

    let deserialized_msg:Message = serde_json::from_str(&serialized_msg).unwrap();

    println!("Deserialized name:{}, age:{}, fav_num:{}", deserialized_msg.name, deserialized_msg.age, deserialized_msg.favorite_number);
}

実行するとこんな感じ

Serialized:{"name":"Motii","age":18,"favorite_number":123.456}
Deserialized name:Motii, age:18, fav_num:123.456

おわりに#

調べれば同じようなことをしている資料が出てくるかもしれないので、いろんな情報を取捨選択して頑張りましょう。