应将JSON数组置入元组中,并给它类型标签



我的json看起来像:

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

当然,数组中的对象除了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>,
);

游乐场

on(可能是)旁注,如果您的类型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,
);

最新更新