Go语言 如何检测接收到的JSON是否有未知字段

6tr1vspr  于 2022-12-07  发布在  Go
关注(0)|答案(2)|浏览(265)

我正在试图找到一些方法来禁止Go语言中任意的JSON键和字段。目前,如果我发送的有效载荷在struct中包含未声明的字段,服务将正常工作,并将Map实体描述的字段(如json:"id,omitempty")。例如:

type Foo struct {
    Bar         int        `json:"id,omitempty"`
}

已接收JSON:

{
  "id": 12,
  "hey": "hey"
}

有谁能帮我找到跟踪负载中未知字段的方法吗?在这种情况下,我需要返回一个错误。

ar7v8xwq

ar7v8xwq1#

更新:

您可能需要使用DisallowUnknownFields()读取器来获取更多信息

老答:

有一个golang 1.9的建议:proposal: some way to reject unknown fields in encoding/json.Decoder
在此之前,您可以尝试类似playground的代码(代码如下)。关键思想是将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
}

你甚至可以使用reflect直接从Foo结构体中获取允许的键来摆脱变量allowedFooKeysHow to read struct field decorators?

uz75evzq

uz75evzq2#

从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

相关问题