Commit 671bddf0 authored by Russ Cox's avatar Russ Cox

encoding/json: fix out of phase error unmarshaling non-string into TextUnmarshaler

Fixes #9650.

Change-Id: I45b879124691e485b86c1e99a3227032283850d2
Reviewed-on: https://go-review.googlesource.com/12208Reviewed-by: default avatarAndrew Gerrand <adg@golang.org>
parent 29f03a37
......@@ -682,6 +682,7 @@ func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool
} else {
d.saveError(&UnmarshalTypeError{"string", v.Type(), int64(d.off)})
}
return
}
s, ok := unquoteBytes(item)
if !ok {
......
......@@ -9,6 +9,7 @@ import (
"encoding"
"fmt"
"image"
"net"
"reflect"
"strings"
"testing"
......@@ -1394,6 +1395,30 @@ func TestInvalidUnmarshal(t *testing.T) {
}
}
var invalidUnmarshalTextTests = []struct {
v interface{}
want string
}{
{nil, "json: Unmarshal(nil)"},
{struct{}{}, "json: Unmarshal(non-pointer struct {})"},
{(*int)(nil), "json: Unmarshal(nil *int)"},
{new(net.IP), "json: cannot unmarshal string into Go value of type *net.IP"},
}
func TestInvalidUnmarshalText(t *testing.T) {
buf := []byte(`123`)
for _, tt := range invalidUnmarshalTextTests {
err := Unmarshal(buf, tt.v)
if err == nil {
t.Errorf("Unmarshal expecting error, got nil")
continue
}
if got := err.Error(); got != tt.want {
t.Errorf("Unmarshal = %q; want %q", got, tt.want)
}
}
}
// Test that string option is ignored for invalid types.
// Issue 9812.
func TestInvalidStringOption(t *testing.T) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment