问题是如何在 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())
}
}
这里可以运行:
关于Json 文件语法验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48216121/