繁体   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