I\xca\xbcm 尝试读取 JSON 流,其中一部分看起来像
\n "data": [\n "c1a8f800a4393e0cacd05a5bc60ae3e0",\n "bbac4013c1ca3482155b584d35dac185",\n "685f237d4fcbd191c981b94ef6986cde",\n "a08898e81f1ddb6612aa12641b856aa9"\n ]\nRun Code Online (Sandbox Code Playgroud)\n(列表中有更多条目data,每个条目都更长,但这应该是说明性的;列表的长度和每个十六进制字符串的长度在编译时都是已知的)
理想情况下,我\xca\xbcd想要一个单一的[u8; 64](实际大小在编译时已知),或者失败,a Vec<u8>,但我想\xca\xbcs更容易将其反序列化为aVec<[u8; 16]>并稍后合并它们。然而,我\xca\xbcm 甚至连这一点都遇到困难。
该hex板条箱有一种方法将单个十六进制字符串反序列化为 aVec或 的数组u8,但我可以\xca\xbct 弄清楚如何告诉 Serde 对列表的每个条目执行此操作。有没有一种简单的方法可以让 I\xca\xbcm 忽略,或者我需要编写自己的列表反序列化器?
Serde 能够以嵌套方式使用来自其他包的序列化器和反序列化器#[serde(with = "...")]。由于 hex 具有 serde 功能,因此可以轻松完成此操作。
这是一个使用 serde_json 和十六进制的简单示例。
货物.toml
serde = { version = "1.0.133", features = ["derive"] }
serde_json = "1.0.74"
hex = { version = "0.4", features = ["serde"] }
Run Code Online (Sandbox Code Playgroud)
主程序.rs
use serde::{Deserialize, Serialize};
use serde_json::Result;
#[derive(Serialize, Deserialize, Debug)]
struct MyData {
data: Vec<MyHex>,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(transparent)]
struct MyHex {
#[serde(with = "hex::serde")]
hex: Vec<u8>,
}
fn main() -> Result<()> {
let data = r#"
{
"data": [
"c1a8f800a4393e0cacd05a5bc60ae3e0",
"bbac4013c1ca3482155b584d35dac185",
"685f237d4fcbd191c981b94ef6986cde",
"a08898e81f1ddb6612aa12641b856aa9"
]
}
"#';
let my_data: MyData = serde_json::from_str(data)?;
println!("{:?}", my_data); // MyData { data: [MyHex { hex: [193, 168, 248, 0, 164, 57, 62, 12, 172, 208, 90, 91, 198, 10, 227, 224] }, MyHex { hex: [187, 172, 64, 19, 193, 202, 52, 130, 21, 91, 88, 77, 53, 218, 193, 133] }, MyHex { hex: [104, 95, 35, 125, 79, 203, 209, 145, 201, 129, 185, 78, 246, 152, 108, 222] }, MyHex { hex: [160, 136, 152, 232, 31, 29, 219, 102, 18, 170, 18, 100, 27, 133, 106, 169] }] }
return Ok(());
}
Run Code Online (Sandbox Code Playgroud)