首页 > 解决方案 > 去 un/marshal 结构为 json

问题描述

我需要将 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)

标签: gomarshalling

解决方案


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


推荐阅读