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