簡體   English   中英

如何檢測收到的 JSON 是否有未知字段

[英]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)
}

您可以在此處找到完整的工作示例:

https://go.dev/play/p/HoGDIt8nJB7

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM