【发布时间】:2020-12-09 14:59:07
【问题描述】:
例如,我们添加一个在 *.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文件和struct文件进行修改.
【问题讨论】:
-
您应该使用
Value而不是Deserialize。 -
@Aplet123 这是一种安全的做法,如果可以使用强类型选项,我注意到许多讨论不鼓励
value。 -
动态加载模式时不需要静态类型。也就是说,您仍然可以在
Value上进行类型验证并拥有强类型,只是在运行时而不是编译时。
标签: rust serde-json