3

我的 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似乎对 size 数组一无所知PhantomData并期望数组4,这可以通过Deserializer手动实现来解决,这正是我想要避免的事情。

我没有寄予厚望,但也许这可以做到,我不知道。

4

1 回答 1

3

您似乎希望 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>,
);

操场

在(可能)旁注上,如果您的类型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,
);
于 2017-09-28T12:57:36.393 回答