Json文件语法验证
问题是如何在golang中验证json文件中的语法?我知道,如果我遗漏了逗号或括号,我可以解组字节片并得到标准错误。如何在发生错误的文件中获取行?如果错误是输入JSON中的语法错误,则从解组返回的错误将是Json文件语法验证,json,validation,go,syntax,Json,Validation,Go,Syntax,问题是如何在golang中验证json文件中的语法?我知道,如果我遗漏了逗号或括号,我可以解组字节片并得到标准错误。如何在发生错误的文件中获取行?如果错误是输入JSON中的语法错误,则从解组返回的错误将是*JSON.SyntaxError: 这包含导致错误的输入字节片中的位置,因为它是偏移字段。要获得此值,请执行类型切换以检查是否是此类型的错误,并将其转换为此类型,以根据此处的说明从中获取偏移值: 然后,您可以使用bufio扫描仪查找行号: 总而言之,您拥有以下代码: package ma
*JSON.SyntaxError
:
这包含导致错误的输入字节片中的位置,因为它是偏移字段。要获得此值,请执行类型切换以检查是否是此类型的错误,并将其转换为此类型,以根据此处的说明从中获取偏移值:
然后,您可以使用bufio扫描仪查找行号:
总而言之,您拥有以下代码:
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中的语法错误,则从解组返回的错误将是
*JSON.SyntaxError
:
这包含导致错误的输入字节片中的位置,因为它是偏移字段。要获得此值,请执行类型切换以检查是否是此类型的错误,并将其转换为此类型,以根据此处的说明从中获取偏移值:
然后,您可以使用bufio扫描仪查找行号:
总而言之,您拥有以下代码:
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())
}
}
这在这里是可运行的: