2017-01-18 16 views
2

私は、受信フレームを逆シリアル化してserde_json::Valueに入れて、この値を(潜在的に多くの)コールバックに渡すwebsocketサーバーを作成しています。エンコード/デコードパスなしで、serde_json::Valueを新しいタイプ(たとえば、下記の例ではMyType)に変換するコールバックをご希望です。 serde機械はこれを行うのに十分な情報を持っている必要があります(含まれているフィールドとタイプが一致しないとエラーが発生する可能性があります)。以下の例では、関数to_my_type()はこのコールバック関数を表しています。私はこの機能からバイパスしたいエンコード/デコードです。serde_json :: Valueを具体的な型に変換する方法デシリアライズ特性を実装するには?

もちろん、生のコード化されたデータを各コールバックに渡すことはできますが、各コールバックは別々にデコードする必要があります。私はコールバックの関数シグネチャをタイプserde_json::Valueの引数をとっておき、異なるコールバックが異なるタイプを得ることができるようにしますが、すべてを共通の関数シグネチャで登録することができます。

#![feature(proc_macro)] 

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

#[derive(Serialize, Deserialize)] 
struct MyType { 
    a: bool, 
} 

fn as_json(a: &MyType) -> serde_json::Value { 
    let buf = serde_json::to_vec(a).unwrap(); 
    serde_json::from_slice::<serde_json::Value>(&buf).unwrap() 
} 

fn to_my_type(value: serde_json::Value) -> MyType { 
    // How to convert a serde_json::Value into MyType without encode/decode pass? 
    let buf = serde_json::to_vec(&value).unwrap(); 
    serde_json::from_slice::<MyType>(&buf).unwrap() 
} 

fn main() { 
    let store = MyType{a: true}; 
    let raw_json = as_json(&store); 
    let _store2 = to_my_type(raw_json); 
} 
+0

あなたの質問がより明確にすることができますか?私はそれが何らかの形で暗黙のうちに(「serdeでこれらの変換関数を登録する方法」のような)何かを暗黙的に考えていると思います。 – hansaplast

+0

質問は私のポストのタイトルです "どのようにserer_json :: Valueを具体化して特性をデシリアライズする方法に変換するのですか?"サンプルコード "serde_json :: Valueをエンコード/デコードパスなしでMyTypeに変換する方法"で再度説明します。 –

答えて

4

あなたはDeserializeを実装する任意の型にValueを変換するserde_json::from_value機能を使用することができます。

fn to_my_type(value: serde_json::Value) -> MyType { 
    serde_json::from_value(value).unwrap() 
} 
+0

ありがとうございます。私はどのように私はドキュメントでそれを逃したか分からない。 –

関連する問題