2016-12-13 6 views
0

私はgorilla websocketを使用しています。私はjsonを使用してシリアライズ/デシリアライゼーションを行っています。WebSocketシリアル化/デシリアライズjson

type Foo struct { 
    A string `json:"a"` 
    B string `json:"b"` 
} 

type Bar struct { 
    C string `json:"c"` 
    D string `json:"d"` 
} 

ゴリラが着信メッセージを受信するためのconn.ReadJSONを提供:

レッツは、着信メッセージを受信するために私はこのような構造体を持っていると言います。受信メッセージはFooやBarでもかまいませんが、conn.ReadJSON(Foo)は使用できません。他のメッセージはconn.ReadJSON(Bar)です。私はちょうどconn.ReadJSON(Messages)のような、JSON.parse()のようなものがjavascriptでほしいと思う。 Fooが受信された場合に受信メッセージを処理する方法、次にFoo構造体に格納され、Barが受信された場合はBar structに格納されますか?私は解決策をthingkingてる

は、この構造体を使用している:

type Messages struct { 
    Control string `json:"control"` 
    X // Data type for either Foo or Bar struct 
} 

受信メッセージは今、JSONコントロールを持っているコントロールの値はFooのかバーすることができます。 control == Fooの場合if elseを使用するとXがFooに割り当てられ、そうでない場合はXがBarに割り当てられます。しかし、私はXのデータ型を理解できません。

いずれの解決策もありがとうございます。

答えて

3

RawMessageを使用してください。

type Messages struct { 
    Control string `json:"control"` 
    X json.RawMessage 
} 

var m Messages 
err := c.ReadJSON(&m) 
if err != nil { 
    // handle error 
} 
switch m.Control { 
case "Foo": 
    var foo Foo 
    if err := json.Unmarshal([]byte(m.X), &foo); err != nil { 
     // handle error 
    } 
    // do something with foo 

case "Bar": 
    ... follow pattern for Foo 

} 
+0

本当にありがとうございました。本当に助けになりました。解決策は 'encoding/json'です。私はもう一度お読みになる前に、感謝します。 – billyzaelani

関連する問題