[] json.Rawmessage是什么意思?

时间:2018-02-07 00:06:22

标签: arrays go structure slice

[]json.Rawmessage的含义是什么?它在这个结构中:

type Request struct {
    Jsonrpc string            `json:"jsonrpc"`
    Method  string            `json:"method"`
    Params  []json.RawMessage `json:"params"`
    ID      interface{}       `json:"id"`
}

我知道它是json的一种类型。我不明白.RawMessage指的是什么。我试着在golang tour和golang书中查找它。最后我知道Params类型[]json.Rawmessage被捆绑到另一个名为Request

的类型中

Futhermore:

这些细分json:"jsonrpc"发生了什么。字符串文字是否以某种方式附加到var?这不是golang之旅或我的golang书。谢谢你的时间。

2 个答案:

答案 0 :(得分:1)

[]定义切片

json是包import名称(来自上面的导入语句)

RawMessage是包中的type。在这种情况下为[]字节类型。

json:"params"field tag。 json包用反射读取它并确定用于json的名称。

答案 1 :(得分:1)

大多数情况下,您需要查看软件包文档而不是某本书和在线游览。

json:"jsonrpc"是一个结构标记 对于这种特定情况,json.Marshal函数将读取该struct标记并返回具有给定值的JSON字段名称。有关“encoding / json”结构标记用法的更多信息:https://golang.org/pkg/encoding/json/#Marshal

对于RawMessage,您可以在此处详细了解https://golang.org/pkg/encoding/json/#RawMessage type RawMessage []byte

通常我在使用“通用”类型的JSON对象时不需要正确处理(也许我只是将它们发送到另一个服务,或者我将在以后根据条件解组)。例如(我将使用您的Request结构):

jsonString := `[
  {
    "id": 123,
    "method": "getSomething",
    "params": [{"A": 1, "B": 2}]
  }
  {
    "id": 123,
    "method": "getSomethingElse",
    "params": [{"C": 1, "D": 2}]
  }
]`

使用此处理代码:

var requests []Request
json.Unmarshal([]byte(jsonString), &requests)
// if no error, you will have 2 items in requests
// requests[0].Params[0] is equal to []byte(`{"A": 1, "B": 2}`)
// requests[1].Params[0] is equal to []byte(`{"C": 1, "D": 2}`)

for _, req := range requests {
  if req.Method == "getSomething" {
    justProxyThisRequestToAnotherService(req)
  } else if req.Method == "getSomethingElse" {
    var params []map[string]int
    json.Unmarshal(req.Params, &params)
    // then do something with params
  }
}