将un / marshal结构作为json

问题描述 投票:0回答:2

我需要将json rpc消息包装在go结构中这是我的第一个想法,适用于这样的传出消息

// Message wrapper
type Message struct {
    ID      *string      `json:"id,omitempty"`
    JSONRPC string       `json:"jsonrpc"`
    Method  *string      `json:"method,omitempty"`
    Params  *interface{} `json:"params,omitempty"`
    Result  *interface{} `json:"result,omitempty"`
}

// NewNotification creates a RPC Notification
func NewNotification(method string, params interface{}) Message {

    m := Message{}
    m.JSONRPC = "2.0"
    m.Method = &method
    m.Params = &params

    return m

}

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

t := Test{"abc", "def"}

m := NewNotification("testMethod", t)

socket.WriteJSON(m)

但是现在对于接收方向,我对Params *interface{}声明。

我通过Params字段识别Method有效负载类型,并希望将Params解组到该结构...但是因此我需要类型json.RawMessage可以使Params正常工作。

我不想定义MessageInMessageOut结构!

m := Message{}
socket.ReadJSON(m)

t := Test{}

json.Unmarshal(m.Params, &t)

go marshalling
2个回答
1
投票

您应将json.RawMessage用作参数和结果字段的类型。这将延迟这些字段的解码,直到您知道接收端的方法是什么。查阅文档和示例:相同的用例:https://golang.org/pkg/encoding/json/#RawMessage


0
投票

[好吧,这个想法有MessageInMessageOut结构,但它们共享Message的共同部分。这样,可以让WriteJson在发送方向上进行编组。当方法和假定的有效载荷类型已知时,必须手动完成接收解组。

© www.soinside.com 2019 - 2024. All rights reserved.