1

たとえば、*.rs スクリプト内で使用される構造を追加します。

#[derive(Serialize, Deserialize, Debug)]
struct Foo {
    Output: OUTPUT,
    input: INPUT,
    logs: LOGS,
}

#[derive(Serialize, Deserialize, Debug)]
struct OUTPUT {
    width: u32,
    samplerate: u32,
}

#[derive(Serialize, Deserialize, Debug)]
struct INPUT {
    fileinputuri: String,
}

#[derive(Serialize, Deserialize, Debug)]
struct LOGS {
    statuslog: String,
}

これは、

let var: Foo = serde_json::from_str(&contents).expect("error while reading json");

JSON でフィールドwidth: u32,をに変更すると、構造体が次のように変更されます。n_width: u32,

#[derive(Serialize, Deserialize, Debug)]
struct OUTPUT {
    n_width: u32,
    samplerate: u32,
}

これを *.rs ファイルに追加して毎回更新するのではなく、構造体を構成ファイルに抽出し、関数呼び出し時に更新およびロードできますか?

構造体を *.rs ファイルから分離することによる安全性やパフォーマンスへの影響はありますか?

構造体を更新せずに JSON を変更できる、より良い匿名/無名の方法はありますか?

以下のコメントによると、使用serde_json::Valueはオプションですが、これは厳密に型指定された構造の代わりに使用できる安全な方法ですか? JSON ファイルにアクセスする悪意のあるユーザーによる操作に対するメモリの安全性とセキュリティが心配です。

pub enum Value {
    Null,
    Bool(bool),
    Number(Number),
    String(String),
    Array(Vec<Value>),
    Object(Map<String, Value>),
}

このプログラムのフィールドへの参照はこれ以上必要n_widthないため、Rust 開発チームがコードを開く必要はなく、JSON チームだけが JSON ファイルと構造体ファイルに変更を加えると仮定します。

4

2 に答える 2

1

動的に定義されたデータ検証が必要な場合は、JSON スキーマなどの使用を検討する必要があります。

動的フィールドと静的フィールドを組み合わせる必要がある場合は、これを一緒に使用できますserde(flatten)(Shepmaster の回答で指摘されているように)。

于 2020-12-09T21:13:25.523 に答える