JSONの操作
serde_json
「JSONの操作」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。
serde_json クレート
serde_json は serde 用の JSON 形式実装です。Rust の値と JSON テキストを相互変換する関数を提供します。
- テキストには
to_string/from_str - 動的な JSON には
Value
構造体を JSON 文字列に変換する
serde_json::to_string は、任意の Serialize 値を JSON 文字列にシリアライズします。
use serde::Serialize;
#[derive(Serialize)]
struct User { id: u32, name: String }
fn main() {
let u = User { id: 1, name: "Alice".to_string() };
let json = serde_json::to_string(&u).unwrap();
println!("{}", json);
}JSON 文字列を構造体に変換する
serde_json::from_str は JSON を型付きの値として解析し、形式が正しくない入力を処理できるように Result を返します。
use serde::Deserialize;
#[derive(Deserialize, Debug)]
struct User { id: u32, name: String }
fn main() {
let data = r#"{"id":1,"name":"Alice"}"#;
let u: User = serde_json::from_str(data).unwrap();
println!("{:?}", u);
}整形出力
人間が読みやすいインデント付き JSON を出力するには to_string_pretty を使います。設定ファイルやデバッグに便利です。
use serde::Serialize;
#[derive(Serialize)]
struct Cfg { debug: bool, level: u8 }
fn main() {
let c = Cfg { debug: true, level: 3 };
println!("{}", serde_json::to_string_pretty(&c).unwrap());
}json! マクロ
json! マクロを使うと、構造体を定義せずに JSON をインラインで構築でき、Value が生成されます。
use serde_json::json;
fn main() {
let v = json!({
"name": "Alice",
"roles": ["admin", "user"]
});
println!("{}", v);
}Value 型
serde_json::Value は、null、bool、数値、文字列、配列、オブジェクトのいずれかの JSON ノードを表す列挙型です。形状が不明な場合に使います。
use serde_json::Value;
fn main() {
let data = r#"{"name":"Bob","age":30}"#;
let v: Value = serde_json::from_str(data).unwrap();
println!("{}", v["name"]);
println!("{}", v["age"]);
}Value から安全に読み取る
インデックスアクセスは Value を返します。型付きデータを安全に読み取るには、Option を返す as_str や as_i64 などのアクセサメソッドを使います。
use serde_json::Value;
fn name_of(v: &Value) -> Option<&str> {
v.get("name")?.as_str()
}通常の Rust で JSON アクセスをモデル化する
キーで値を読み取り、存在しない場合に代替値を使う処理は、Value オブジェクトへの問い合わせ方と同じです。ここでは HashMap を使います。
use std::collections::HashMap;
fn main() {
let mut obj: HashMap<&str, &str> = HashMap::new();
obj.insert("name", "Alice");
let name = obj.get("name").copied().unwrap_or("unknown");
let city = obj.get("city").copied().unwrap_or("unknown");
println!("name={} city={}", name, city);
}バイト列とライター
パフォーマンスを重視する場合、to_vec はバイト列にシリアライズし、to_writer はファイルやソケットなどの任意の io::Write に直接ストリーム出力します。
use serde::Serialize;
#[derive(Serialize)]
struct Msg { text: String }
fn to_bytes(m: &Msg) -> Vec<u8> {
serde_json::to_vec(m).unwrap()
}解析エラーの処理
from_str は Result を返します。エラーを match して、パニックを起こす代わりにユーザーに役立つメッセージを表示しましょう。
use serde::Deserialize;
#[derive(Deserialize)]
struct User { id: u32 }
fn parse(s: &str) -> String {
match serde_json::from_str::<User>(s) {
Ok(u) => format!("id {}", u.id),
Err(e) => format!("invalid JSON: {}", e),
}
}Value と構造体の相互変換
serde_json::from_value と to_value を使うと、型付き構造体と動的な Value を相互変換できます。
use serde::Deserialize;
use serde_json::json;
#[derive(Deserialize)]
struct User { name: String }
fn main() {
let v = json!({"name": "Eve"});
let u: User = serde_json::from_value(v).unwrap();
println!("{}", u.name);
}理解度チェック
JSON の操作についての理解度を確認しましょう。
まとめ
serde_json を使った JSON の扱いを学びました。
to_string/from_strで構造体と JSON テキストを相互変換しますto_string_prettyで読みやすく整形しますjson!マクロとValueで動的な JSON を扱います- アクセサと
Resultを使って安全に読み取り、解析します
次は、フィールド属性によるシリアライズのカスタマイズです。
よくある質問
「JSONの操作」レッスンは無料ですか?
はい。「JSONの操作」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。
「JSONの操作」で何を学びますか?
serde_json ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「JSONの操作」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。