Json 文件语法验证

标签 json validation go syntax

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

最佳答案

如果错误是输入 JSON 中的语法错误,则解码返回的错误将是 *json.SyntaxError:

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

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

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

然后您可以使用 bufio 扫描仪查找行号:

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

关于Json 文件语法验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48216121/

相关文章:

design-patterns - 使用 MVVM/WPF 进行域驱动设计

javascript - 如何测试 Yup.array 中值的唯一性?

json - 带有空 objectid 引用的 Mongo 保存文档 - 错误 : Invalid ObjectId in JSON

go - RethinkDB changefeed 使用 `now()` 过滤

java - 反序列化问题

C#:当一个字段可以是不同类型时反序列化 JSON

json - 使用 JQ Issue 解析复杂的 JSON 文件

c# - Json.net反序列化具有并发集合的复杂对象

php - 电子邮件地址验证方法(订阅按钮)

go - 如何添加对象掩码以使用 golang 调用 GetNetworkVlans