gpt4 book ai didi

rust - 将 JSON 数组反序列化为元组并为其赋予类型标签

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

我的 JSON 看起来像:

[{"range": [1, 2]}, {"range": [2, 5]}]

array 中的对象当然有 range 以外的字段,但没关系。

是否可以将它们反序列化为具有两个幻像类型的元组,以自动指示开始和结束是包含还是排斥?

这也可以通过将数字反序列化为某种具有幻像类型的元组来解决。

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

use std::marker::PhantomData;

#[derive(Debug)]
struct Inclusive;
#[derive(Debug)]
struct Exclusive;

#[derive(Deserialize)]
struct Range<S, E, V: Ord>(Option<V>, Option<V>, PhantomData<S>, PhantomData<E>);

fn main() {
let data = "[1, 2]";
let r: Range<Inclusive, Exclusive, i32> = serde_json::from_str(data).expect("Error");
println!("Range from {:?} to {:?}", r.0, r.1);
}

这不起作用,因为 serde_json 似乎对 PhantomData 一无所知,并期望大小为 4 的数组,这可以通过实现来解决Deserializer 手动,这正是我想避免的事情。

我不抱太大希望,但也许这可以做到,但我不知道什么。

最佳答案

您似乎希望 serde 完全忽略某些字段。这可以用 #[serde(skip)] 来完成. Serde 将从 Default::default() 获取一个默认值,该值可用于 PhantomData

#[derive(Debug, Deserialize)]
struct Range<S, E, V: Ord>(
Option<V>,
Option<V>,
#[serde(skip)] PhantomData<S>,
#[serde(skip)] PhantomData<E>,
);

Playground

在(可能)旁注中,如果您的类型 InclusiveExclusive 总是类单元而不是单例,您可以考虑直接持有它们而不是 PhantomData,因为它们也将是零大小。

#[derive(Debug, Default)]
struct Inclusive;
#[derive(Debug, Default)]
struct Exclusive;

#[derive(Deserialize)]
struct Range<S, E, V: Ord>(
Option<V>,
Option<V>,
#[serde(skip)] S,
#[serde(skip)] E,
);

关于rust - 将 JSON 数组反序列化为元组并为其赋予类型标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46469334/

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