gpt4 book ai didi

json - 我如何进行模式匹配以获得 serde_json 已解析的数字?

转载 作者:行者123 更新时间:2023-11-29 08:18:43 26 4
gpt4 key购买 nike

我想将第 3 方库枚举与 JSON 相互转换。因为我不想编辑第 3 方源代码,所以我不想使用派生宏。

我想手写serde_json deserialize 方法。我认为模式匹配是可行的方法,但我需要匹配的内容不公开:

extern crate serde_json;

#[test]
fn test_parse_from_json() {
let s = r#"{
"e": 0,
"c": 1,
"n": 2
}"#;

let v: Map<String, Value> = serde_json::from_str(&s).unwrap();

match (&v["e"], &v["c"], &v["n"]) {
(&Value::Number(ref e), &Value::Number(ref c), &Value::Number(ref n)) => {
// e is a PosInt(u64) but that isn't public to match one nor access its methods!
let value = e.n; // error[E0616]: field `n` of struct `serde_json::Number` is private
}
_ => (),
}

}

那不编译。如果我用我可以设置断点的东西替换那个内部位,我可以在调试器中看到 e 是一个包含 PosInt(0) 的 Number

最佳答案

您不能在私有(private)字段上进行模式匹配,因为它们是私有(private)的。您必须使用图书馆决定提供的访问器。 Number 的 serde_json 文档显示它有类似 as_u64 的方法:

let value = e.as_u64().expect("not a u64");

As I don't want to edit the 3rd party source code I don't want to use the derive macros.

您可能正在遭受 X-Y problem .例如,Serde 文档描述了如何 implement the traits for a "remote type" .

您还可以创建自己的反序列化类型,并构建与库类型之间的转换:

#[macro_use]
extern crate serde_derive;
extern crate serde_json;

#[derive(Deserialize)]
struct Mine {
e: u64,
c: u64,
n: u64,
}

#[test]
fn test_parse_from_json() {
let s = r#"{
"e": 0,
"c": 1,
"n": 2
}"#;

let v: Mine = serde_json::from_str(&s).unwrap();
println!("{:?}", (v.e, v.c, v.n));
}

关于json - 我如何进行模式匹配以获得 serde_json 已解析的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45244559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com