如果收到json有未知字段,如何在golang中抛出错误?

时间:2017-07-12 10:36:52

标签: json go

我试图找到一些方法来禁止golang中的json任意键和字段。现在,如果我在struct中发送未声明字段的有效负载,则服务将正常工作并将映射到实体描述的字段(如db_index=True)。 例如,

json:"id,omitempty"

收到了json

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

有人可以帮我找到跟踪有效载荷中未知字段的方法吗?我需要在这种情况下抛出错误

1 个答案:

答案 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?