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");

当我将字段更改width: u32,n_width: u32,JSON 时,我们会将结构更改为

#[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文件和struct文件进行修改即可。

4

2 回答 2

1

如果您想要动态定义的数据验证,您应该考虑使用JSON Schema 之类的东西。

如果您需要混合使用动态和静态字段,可以将其与serde(flatten)(如 Shepmaster 的回答中所指出的)一起使用。

于 2020-12-09T21:13:25.523 回答
0

假设n_width本程序中不需要对该字段进行进一步的引用,因此 Rust 开发团队无需打开代码,只需 JSON 团队对 JSON 文件和 struct 文件进行更改。

如果 Rust 代码不关心字段,那么首先不要将它们添加到结构中。默认情况下,数据中未包含在结构中的其他字段将被静默忽略

如果您需要捆绑额外的数据,但从不需要在 Rust 代码中对其进行操作(例如在代理应用程序中),请查看如何使用 Serde 的自定义(反)序列化来更新任意输入的子集?

于 2020-12-09T15:32:42.037 回答