[英]How to detect if received JSON has unknown fields
我試圖找到一些方法來禁止 Go 中的任意 JSON 鍵和字段。現在,如果我在結構中發送帶有未聲明字段的有效負載,該服務將正常工作並將 map 實體描述字段(如json:"id,omitempty"
)。 例如:
type Foo struct {
Bar int `json:"id,omitempty"`
}
收到JSON:
{
"id": 12,
"hey": "hey"
}
誰能幫我找到跟蹤有效載荷中未知字段的方法? 在那種情況下我需要返回一個錯誤。
您可能想使用DisallowUnknownFields()
閱讀更多信息
Golang 1.9對此有一個建議: proposal:一種拒絕encoding / json.Decoder中未知字段的方法
到那時為止,您可以嘗試像這樣的游樂場 (下面的代碼)。 關鍵思想是將json解析為map [string] interface {},然后使用這些鍵。 如果您具有嵌套結構,這當然會變得更加復雜。
package main
import (
"encoding/json"
"fmt"
)
type Foo struct {
Bar int `json:"id,omitempty"`
}
var allowedFooKeys = []string{"id"}
func main() {
b := []byte(`{
"id": 12,
"hey": "hey"
}`)
m := map[string]interface{}{}
if err := json.Unmarshal(b, &m); err != nil {
panic(err)
}
for k, _ := range m {
if !keyExists(k, allowedFooKeys) {
fmt.Println("Disallowed key in JSON:", k)
}
}
}
func keyExists(key string, keys []string) bool {
for _, k := range keys {
if k == key {
return true
}
}
return false
}
您甚至可以通過使用反射直接從Foo
結構中獲取允許的鍵來擺脫變量allowedFooKeys
。 有關更多信息,請參見此處: 如何讀取struct字段裝飾器?
自 Go 1.10 起,JSON 解碼器為此用例提供了DisallowUnknownFields()
選項。
func StrictUnmarshal(data []byte, v interface{}) error {
dec := json.NewDecoder(bytes.NewReader(data))
dec.DisallowUnknownFields()
return dec.Decode(v)
}
您可以在此處找到完整的工作示例:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.