验证JSON并显示错误位置

时间:2016-08-11 15:28:46

标签: json validation go

我想在Go中解析和验证(自定义)JSON配置文件。我希望能够将文件解析为结构并验证:

  1. JSON文件中没有意外的密钥(特别是检测拼写错误)
  2. 某些键存在且具有非空值
  3. 如果验证失败(或者出现语法错误),我想向用户打印一条错误消息,尽可能详细地说明错误发生在文件中的位置(例如,如果可能,请说明行号) )。

    Go中内置的JSON解析器似乎只是默默地忽略了意外的键。我还尝试使用jsonpb(Protobuf)来反序列化JSON,如果出现意外键,它会返回错误,但不报告位置。

    要检查非空值,我可以使用现有的验证库,但我没有看到任何报告详细的错误消息。或者,我可以编写自定义代码来验证内置JSON解析器返回的数据,但是如果有通用的方法会很好。

    是否有一种简单的方法可以获得所需的行为?

2 个答案:

答案 0 :(得分:2)

你看过JSON schema吗?

  

JSON Schema描述了您的JSON数据格式。

我相信它处于草案阶段,但很多语言都有验证库。这是Go实施:

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