[英]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)
}
您可以在此处找到完整的工作示例:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.