我试图找到一些方法来禁止golang中的json任意键和字段。现在,如果我在struct中发送未声明字段的有效负载,则服务将正常工作并将映射到实体描述的字段(如db_index=True
)。
例如,
json:"id,omitempty"
收到了json
type Foo struct {
Bar int `json:"id,omitempty"`
}
有人可以帮我找到跟踪有效载荷中未知字段的方法吗?我需要在这种情况下抛出错误
答案 0 :(得分:4)
您可能想要使用DisallowUnknownFields()
read for more info
有关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直接从allowedFooKeys
结构获取允许的键来删除变量Foo
。有关详细信息,请参阅此处:How to read struct field ` ` decorators?