を入力し、それを与える:逆シリアル化JSON配列と、私はのように見えるJSON持っタグに
[{"range": [1, 2]}, {"range": [2, 5]}]
配列内のオブジェクトはもちろんのrange
以外の分野を持っているが、それは問題ではありませんが。
開始点と終了点が自動的に包括的か排他的かを示す2つのファントム型を持つタプルにデシリアライズすることはできますか?
これは、ファントムタイプのいくつかの種類のタプルに数値をデシリアライズすることで解決することもできます。
#[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
について無知であるように思わそして正確に私が避けしたいものである、手動Deserializer
を実装することによって解決することができる大きさ4
の配列を、期待するので、これは動作しません。
私は高い期待はしていませんが、おそらくこれができ、私は何かを知らないのです。
ありがとう!素晴らしい解決策のようだ。厳密に境界の1つが 'Some'になるように' Range'コンストラクタを制約する方法はありますか? – user1685095
@ user1685095それは私が信じることは、別の質問をするでしょう。列挙型の使用を検討してください。 –