【问题标题】:How to validate JSON and show positions of any errors?如何验证 JSON 并显示任何错误的位置?
【发布时间】:2021-08-25 20:20:03
【问题描述】:

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

  1. JSON 文件中不存在意外的键(尤其是用于检测拼写错误)
  2. 某些键存在且具有非空值

如果验证失败(或语法错误),我想向用户打印一条错误消息,尽可能详细地解释文件中错误发生的位置(例如,尽可能说明行号)。

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

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

有没有一种简单的方法来获得所需的行为?

【问题讨论】:

    标签: json validation go


    【解决方案1】:

    你看过JSON schema吗?

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

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

    【讨论】:

    • 谢谢。是的,我尝试了您链接的实现。不幸的是,如果验证失败,它似乎不会返回错误位置。
    • 我自己没有尝试过这个库。也许错误位置是可以添加到其中的?
    • 我对 xeipuuv 的 gojsonschema 进行了更多研究。它可以打印有关错误位置的信息:fmt.Printf("- %s: %s\n", error.Context().String(), error)。这打印:- (root).0: name: name is required
    • 有没有办法使用 JSON Schema 检测意外字段?
    • 我在那个库中写了很多错误处理。您可以定义一个架构,将additionalProperties 设置为false,然后从库中查找additional_property_not_allowed 错误类型。您可以从ResultError.Field() 中提取字段名称以获取意外字段的名称。
    【解决方案2】:

    您还可以使用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

    【讨论】:

      猜你喜欢
      • 2012-10-11
      • 1970-01-01
      • 2012-10-30
      • 2020-03-10
      • 2012-08-24
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多