Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检测接收到的JSON是否有未知字段_Json_Go - Fatal编程技术网

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

如何检测接收到的JSON是否有未知字段,json,go,Json,Go,我试图找到一些方法来禁止Go中任意的JSON键和字段。目前,如果我在struct中发送带有未声明字段的有效负载,服务将正常工作,并将映射实体描述的字段(如json:“id,ommitempty”)。 例如: type Foo struct { Bar int `json:"id,omitempty"` } 收到的JSON: { "id": 12, "hey": "hey" } 有人能帮我找到跟踪有效载荷中未知字段的方法吗?在这种情况下,我需要返回

我试图找到一些方法来禁止Go中任意的JSON键和字段。目前,如果我在struct中发送带有未声明字段的有效负载,服务将正常工作,并将映射实体描述的字段(如
json:“id,ommitempty”
)。 例如:

type Foo struct {
    Bar         int        `json:"id,omitempty"`
}
收到的JSON:

{
  "id": 12,
  "hey": "hey"
}
有人能帮我找到跟踪有效载荷中未知字段的方法吗?在这种情况下,我需要返回一个错误。

更新: 您可能想使用


旧答案: golang 1.9在这方面有一个提案:

在此之前,您可以尝试类似的方法(代码也在下面)。 关键思想是将json解析为map[string]接口{},然后使用键。如果有嵌套结构,这当然会变得更加复杂

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
结构获取允许的键,从而摆脱变量
allowedfookees
。有关这方面的更多信息,请参见此处:

您是说,当示例中的
“嘿”
等字段作为有效负载的一部分发送时,您想抛出一个错误?@kkaosninja,是的,在java中我们“抛出”错误,在golang中我们只是“返回”它们:)