【问题标题】:Json file syntax validationJson 文件语法验证
【发布时间】:2018-01-11 21:31:33
【问题描述】:

问题是如何在golang中验证json文件中的语法?我知道如果我错过了逗号或括号,我可以解组字节片段并获得标准错误。如何在它发生的文件中获取行?

【问题讨论】:

    标签: json validation go syntax


    【解决方案1】:

    如果错误是输入 JSON 中的语法错误,则从 unmarshal 返回的错误将为 *json.SyntaxError

    https://golang.org/pkg/encoding/json/#SyntaxError

    这包含输入字节片中导致错误的位置,因为它是偏移字段。为此,您需要进行类型切换以检查它是否是这种类型的错误并将其转换为这种类型,以按照此处的说明从中获取偏移值:

    https://tour.golang.org/methods/16

    然后您可以使用 bufio Scanner 查找行号:

    https://golang.org/pkg/bufio/#Scanner

    把所有这些放在一起,你就有了这段代码:

    package main
    
    import (
        "fmt"
        "encoding/json"
    )
    
    const myJSON = `
    { 
        "totallyValid": "this is OK",
        "missing quotes: not OK
    }
    `
    
    func main() {
        var result map[string]interface{}
        err := json.Unmarshal([]byte(myJSON), &result)
        switch err := err.(type) {
        case *json.SyntaxError:
            fmt.Printf("Error in input syntax at byte %d: %s\n", err.Offset, err.Error())
            var line int
            var readBytes int64
            for scanner.Scan() {
                // +1 for the \n character
                readBytes += int64(len(scanner.Bytes()) + 1)
                line += 1
                if (readBytes >= err.Offset) {
                    fmt.Printf("Error in input syntax on line %d: %s\n", line, err.Error())
                    break
                }
            }
        default:
            fmt.Printf("Other error decoding JSON: %s\n", err.Error())
        }
    }
    

    这里可以运行:

    https://play.golang.org/p/aZJF20VfvYm

    【讨论】:

      猜你喜欢
      • 2017-07-05
      • 2022-01-06
      • 2023-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      相关资源
      最近更新 更多