使用serde从JSON将键和值列表反序列化为struct?

凝视

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

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

使用动态密钥将JSON反序列化为Object

使用Jackson将Java中不同数量的对象反序列化为列表

如何将JSON字典序列化/反序列化为数组

将具有十六进制值的JSON反序列化为sbyte属性时,JsonConvert.DeserializeObject引发异常

使用Apache Spark将表序列化为嵌套JSON

Newtonsoft json将复杂对象反序列化为具有不同名称的类

将XML反序列化为简单的单个数组

将通用对象序列化/反序列化为字符串

如何使用 `serde_json_core` 在沒有分配的情況下反序列化數組?

在C#中使用嵌套列表反序列化JSON数组对象

无法将JSON数组(例如[1,2,3])反序列化为类型'',因为该类型需要JSON对象(例如{“ name”:“ value”})才能正确反序列化

C#将JSON序列化为类

JSON不反序列化某些值

如何正确地将复杂的Swift对象序列化/反序列化为AWS Lambda负载?

杰克逊将日期从Twitter反序列化为`ZonedDateTime`

使用 Serde JSON 為什麼在反序列化為 RawValue 結構時“{c:[{}]}”會導致堆分配?

如何在ASP.NET中将JSON反序列化为简单的Dictionary <string,string>?

使用Jackson将不同类型反序列化为单个字段

更改列表序列化为 XML 的方式

使属性反序列化但不使用json.net序列化

无法从默认构造函数反序列化为“ this”吗?

如何将服务总线消息SystemProperties.LockToken反序列化为自己的类C#?

Ruby中的JSON反序列化

反序列化Json数组字典对

嵌套JSON的Unity反序列化

从JSON反序列化重复字典

Rust 反序列化 JSON

在没有父对象名称的情况下将对象列表序列化为JSon

無法反序列化對象和對象列表