go: encoding/json: add line number to SyntaxError
What version of Go are you using (go version
)?
$ go version go version go1.15.6 linux/amd64
Does this issue reproduce with the latest release?
Yes
What did you do?
package main
import (
"encoding/json"
"fmt"
"io"
"os"
)
func main() {
dec := json.NewDecoder(os.Stdin)
for {
var m map[string]interface{}
if err := dec.Decode(&m); err == io.EOF {
break
} else if err != nil {
fmt.Printf("%#v\n", err)
break
}
}
}
$ echo -e '{"x":\ny}' | go run jsonline.go
&json.SyntaxError{msg:"invalid character 'y' looking for beginning of value", Offset:7}
At the moment SyntaxError
provides an offset of the character that caused parsing error.
The proposal is add the line number as well.
I could not find such an issue therefore opened this one, please close if it was already resolved.
About this issue
- Original URL
- State: open
- Created 3 years ago
- Reactions: 2
- Comments: 18 (11 by maintainers)
When reading a file or network message, you almost always use json.Decoder, not json.Unmarshal. It would be crazy in many cases to save the whole stream to a buffer in case of error.
I don’t think a performance cost is unreasonable when the feature is triggered by an API. When you really can’t afford the cost, you simply don’t incur it. Note that I suggested an extensible API which can accommodate other decoding options. Maybe accept_comments? 😃
Indeed, most parsers/decoders read in big chunks, because doing one read for every single byte consumed would be incredibly expensive. So a io.Reader layer like @networkimprov suggests won’t work.