gpt4 book ai didi

json - 使用 serde 将键和值列表反序列化为来自 JSON 的结构?

转载 作者:行者123 更新时间:2023-11-29 07:58:05 25 4
gpt4 key购买 nike

我有这样的 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());
}

关于json - 使用 serde 将键和值列表反序列化为来自 JSON 的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47405416/

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