package json
import (
)
var export = jsontext.Internal.Export(&internal.AllowInternalUse)
func ( []byte) bool {
return checkValid() == nil
}
func ( []byte) error {
:= export.GetBufferedDecoder()
defer export.PutBufferedDecoder()
:= export.Decoder()
.Struct.Flags.Set(jsonflags.ReportErrorsWithLegacySemantics | jsonflags.AllowDuplicateNames | jsonflags.AllowInvalidUTF8 | 1)
if , := .ReadValue(); != nil {
if == io.EOF {
:= .InputOffset() + int64(len(.UnreadBuffer()))
= &jsontext.SyntacticError{ByteOffset: , Err: io.ErrUnexpectedEOF}
}
return transformSyntacticError()
}
if := .CheckEOF(); != nil {
return transformSyntacticError()
}
return nil
}
type SyntaxError struct {
msg string
Offset int64
}
func ( *SyntaxError) () string { return .msg }
var errUnexpectedEnd = errors.New("unexpected end of JSON input")
func ( error) error {
switch , := .(*jsontext.SyntacticError); {
case != nil:
if export.IsIOError(.Err) {
return errors.Unwrap(.Err)
}
if .Err == io.ErrUnexpectedEOF {
.Err = errUnexpectedEnd
}
:= .Err.Error()
if := strings.Index(, " (expecting"); >= 0 && !strings.Contains(, " in literal") {
= [:]
}
return &SyntaxError{Offset: .ByteOffset, msg: syntaxErrorReplacer.Replace()}
case :
return (*SyntaxError)(nil)
case export.IsIOError():
return errors.Unwrap()
default:
return
}
}
var syntaxErrorReplacer = strings.NewReplacer(
"object name", "object key",
"at start of value", "looking for beginning of value",
"at start of string", "looking for beginning of object key string",
"after object value", "after object key:value pair",
"in number", "in numeric literal",
)