[英]Deserializing key and value lists as struct from JSON using serde?
我有這樣的JSON:
{
"fieldNames": ["MyInt", "MyFloat", "MyString"],
"fieldValues": [5, 10.0, "hello"],
}
我想反序列化為這樣的結構:
#[derive(Deserialize)]
struct MyStruct {
my_int: u64,
my_float: f64,
my_string: String,
}
有沒有辦法用serde做到這一點? 理想情況下,我想要的是:
#[serde(keys="fieldNames", values="fieldValues")]
像這樣的東西可以工作。 這是使用deserialize_with
函數,可以從包含此結構的任何結構調用。
#[macro_use]
extern crate serde_derive;
extern crate serde;
extern crate serde_json;
use serde::de::{self, Deserialize, DeserializeOwned, Deserializer};
use serde_json::Value;
#[derive(Deserialize, Debug)]
struct Spease(#[serde(deserialize_with = "names_values")] MyStruct);
#[derive(Deserialize, Debug)]
#[serde(rename_all = "PascalCase")]
struct MyStruct {
my_int: u64,
my_float: f64,
my_string: String,
}
fn names_values<'de, T, D>(deserializer: D) -> Result<T, D::Error>
where
T: DeserializeOwned,
D: Deserializer<'de>
{
#[derive(Deserialize)]
struct Helper {
#[serde(rename = "fieldNames")]
names: Vec<String>,
#[serde(rename = "fieldValues")]
values: Vec<Value>,
}
// Deserialize a Vec<String> and Vec<Value>.
let nv = Helper::deserialize(deserializer)?;
// Zip them together into a map.
let pairs = Value::Object(nv.names.into_iter().zip(nv.values).collect());
// Deserialize the output type T.
T::deserialize(pairs).map_err(de::Error::custom)
}
fn main() {
let j = r#"{
"fieldNames": ["MyInt", "MyFloat", "MyString"],
"fieldValues": [5, 10.0, "hello"]
}"#;
println!("{:?}", serde_json::from_str::<Spease>(j).unwrap());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.