package jsoniter import ( "github.com/json-iterator/go/require" "math/big" "testing" "encoding/json" ) func Test_read_map(t *testing.T) { should := require.New(t) iter := ParseString(`{"hello": "world"}`) m := map[string]string{"1": "2"} iter.ReadVal(&m) copy(iter.buf, []byte{0, 0, 0, 0, 0, 0}) should.Equal(map[string]string{"1": "2", "hello": "world"}, m) } func Test_read_map_of_interface(t *testing.T) { should := require.New(t) iter := ParseString(`{"hello": "world"}`) m := map[string]interface{}{"1": "2"} iter.ReadVal(&m) should.Equal(map[string]interface{}{"1": "2", "hello": "world"}, m) iter = ParseString(`{"hello": "world"}`) should.Equal(map[string]interface{}{"hello": "world"}, iter.Read()) } func Test_wrap_map(t *testing.T) { should := require.New(t) any := Wrap(map[string]string{"Field1": "hello"}) should.Equal("hello", any.Get("Field1").ToString()) any = Wrap(map[string]string{"Field1": "hello"}) should.Equal(1, any.Size()) any = Wrap(map[string]string{"Field1": "hello"}) vals := map[string]string{} var k string var v Any for next, hasNext := any.IterateObject(); hasNext; { k, v, hasNext = next() if v.ValueType() == String { vals[k] = v.ToString() } } should.Equal(map[string]string{"Field1": "hello"}, vals) } func Test_map_wrapper_any_get_all(t *testing.T) { should := require.New(t) any := Wrap(map[string][]int{"Field1": {1, 2}}) should.Equal(`{"Field1":1}`, any.Get('*', 0).ToString()) } func Test_write_val_map(t *testing.T) { should := require.New(t) val := map[string]string{"1": "2"} str, err := MarshalToString(val) should.Nil(err) should.Equal(`{"1":"2"}`, str) } func Test_slice_of_map(t *testing.T) { should := require.New(t) val := []map[string]string{{"1": "2"}} str, err := MarshalToString(val) should.Nil(err) should.Equal(`[{"1":"2"}]`, str) val = []map[string]string{} should.Nil(UnmarshalFromString(str, &val)) should.Equal("2", val[0]["1"]) } func Test_encode_int_key_map(t *testing.T) { should := require.New(t) val := map[int]string{1: "2"} str, err := MarshalToString(val) should.Nil(err) should.Equal(`{"1":"2"}`, str) } func Test_decode_int_key_map(t *testing.T) { should := require.New(t) var val map[int]string should.Nil(UnmarshalFromString(`{"1":"2"}`, &val)) should.Equal(map[int]string{1: "2"}, val) } func Test_encode_TextMarshaler_key_map(t *testing.T) { should := require.New(t) f, _, _ := big.ParseFloat("1", 10, 64, big.ToZero) val := map[*big.Float]string{f: "2"} str, err := MarshalToString(val) should.Nil(err) should.Equal(`{"1":"2"}`, str) } func Test_decode_TextMarshaler_key_map(t *testing.T) { should := require.New(t) var val map[*big.Float]string should.Nil(UnmarshalFromString(`{"1":"2"}`, &val)) str, err := MarshalToString(val) should.Nil(err) should.Equal(`{"1":"2"}`, str) } func Test_map_key_with_escaped_char(t *testing.T) { type Ttest struct { Map map[string]string } var jsonBytes = []byte(` { "Map":{ "k\"ey": "val" } }`) should := require.New(t) { var obj Ttest should.Nil(json.Unmarshal(jsonBytes, &obj)) should.Equal(map[string]string{"k\"ey":"val"}, obj.Map) } { var obj Ttest should.Nil(Unmarshal(jsonBytes, &obj)) should.Equal(map[string]string{"k\"ey":"val"}, obj.Map) } }