我想在Go中解析和验证(自定义)JSON配置文件。我希望能够将文件解析为结构并验证:
如果验证失败(或者出现语法错误),我想向用户打印一条错误消息,尽可能详细地说明错误发生在文件中的位置(例如,如果可能,请说明行号) )。
Go中内置的JSON解析器似乎只是默默地忽略了意外的键。我还尝试使用jsonpb(Protobuf)来反序列化JSON,如果出现意外键,它会返回错误,但不报告位置。
要检查非空值,我可以使用现有的验证库,但我没有看到任何报告详细的错误消息。或者,我可以编写自定义代码来验证内置JSON解析器返回的数据,但是如果有通用的方法会很好。
是否有一种简单的方法可以获得所需的行为?
答案 0 :(得分:2)
答案 1 :(得分:0)
您还可以使用 encoding/json
JSON 解码器并在发现意外键时强制错误。它不会告诉你行号,但它只是一个开始,你不需要任何外部包。
package main
import (
"bytes"
"encoding/json"
"fmt"
)
type MyType struct {
ExpectedKey string `json:"expected_key"`
}
func main() {
jsonBytes := []byte(`{"expected_key":"a", "unexpected_key":"b"}`)
var typePlaceholder MyType
// Create JSON decoder
dec := json.NewDecoder(bytes.NewReader(jsonBytes))
// Force errors when unexpected keys are present
dec.DisallowUnknownFields()
if err := dec.Decode(&typePlaceholder); err != nil {
fmt.Println(err.Error())
}
}
你可以看到在操场上工作here