JSON文件语法验证Golang

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSON文件语法验证Golang相关的知识,希望对你有一定的参考价值。

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

答案

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

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

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

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
", err.Offset, err.Error())
        var line int
        var readBytes int64
        for scanner.Scan() {
            // +1 for the 
 character
            readBytes += int64(len(scanner.Bytes()) + 1)
            line += 1
            if (readBytes >= err.Offset) {
                fmt.Printf("Error in input syntax on line %d: %s
", line, err.Error())
                break
            }
        }
    default:
        fmt.Printf("Other error decoding JSON: %s
", err.Error())
    }
}

这可以在这里运行:

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

以上是关于JSON文件语法验证Golang的主要内容,如果未能解决你的问题,请参考以下文章

json [Golang] golang #golang #snippets中有用的片段

Golang实践录:反射reflect的一些研究及代码汇总

golang的xorm如何将[]map[string][]byte 格式的数据序列化成json输出

golang简单实现jwt验证(beegoxormjwt)

golang goroutine例子[golang并发代码片段]

golang代码片段(摘抄)