fix: Fix problems with non support for multidimensional arrays and basic type pointer arrays (#778)
Co-authored-by: shaoqian <shaoqian.zhang@appshahe.com>
This commit is contained in:
@@ -457,6 +457,10 @@ func (u *Unmarshaler) fillSlice(fieldType reflect.Type, value reflect.Value, map
|
|||||||
} else {
|
} else {
|
||||||
conv.Index(i).Set(target.Elem())
|
conv.Index(i).Set(target.Elem())
|
||||||
}
|
}
|
||||||
|
case reflect.Slice:
|
||||||
|
if err := u.fillSlice(dereffedBaseType, conv.Index(i), ithValue); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
if err := u.fillSliceValue(conv, i, dereffedBaseKind, ithValue); err != nil {
|
if err := u.fillSliceValue(conv, i, dereffedBaseKind, ithValue); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -498,12 +502,24 @@ func (u *Unmarshaler) fillSliceValue(slice reflect.Value, index int, baseKind re
|
|||||||
default:
|
default:
|
||||||
// don't need to consider the difference between int, int8, int16, int32, int64,
|
// don't need to consider the difference between int, int8, int16, int32, int64,
|
||||||
// uint, uint8, uint16, uint32, uint64, because they're handled as json.Number.
|
// uint, uint8, uint16, uint32, uint64, because they're handled as json.Number.
|
||||||
if slice.Index(index).Kind() != reflect.TypeOf(value).Kind() {
|
|
||||||
return errTypeMismatch
|
|
||||||
}
|
|
||||||
|
|
||||||
slice.Index(index).Set(reflect.ValueOf(value))
|
if slice.Index(index).Kind() == reflect.Ptr {
|
||||||
return nil
|
baseType := Deref(slice.Index(index).Type())
|
||||||
|
if baseType.Kind() != reflect.TypeOf(value).Kind() {
|
||||||
|
return errTypeMismatch
|
||||||
|
}
|
||||||
|
target := reflect.New(baseType).Elem()
|
||||||
|
target.Set(reflect.ValueOf(value))
|
||||||
|
slice.Index(index).Set(target.Addr())
|
||||||
|
return nil
|
||||||
|
} else {
|
||||||
|
if slice.Index(index).Kind() != reflect.TypeOf(value).Kind() {
|
||||||
|
return errTypeMismatch
|
||||||
|
}
|
||||||
|
|
||||||
|
slice.Index(index).Set(reflect.ValueOf(value))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package mapping
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -2480,3 +2481,40 @@ func BenchmarkUnmarshal(b *testing.B) {
|
|||||||
UnmarshalKey(data, &an)
|
UnmarshalKey(data, &an)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUnmarshalJsonReaderMultiArray(t *testing.T) {
|
||||||
|
payload := `{"a": "133", "b": [["add", "cccd"], ["eeee"]]}`
|
||||||
|
var res struct {
|
||||||
|
A string `json:"a"`
|
||||||
|
B [][]string `json:"b"`
|
||||||
|
}
|
||||||
|
reader := strings.NewReader(payload)
|
||||||
|
err := UnmarshalJsonReader(reader, &res)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.Equal(t, 2, len(res.B))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUnmarshalJsonReaderPtrMultiArray(t *testing.T) {
|
||||||
|
payload := `{"a": "133", "b": [["add", "cccd"], ["eeee"]]}`
|
||||||
|
var res struct {
|
||||||
|
A string `json:"a"`
|
||||||
|
B [][]*string `json:"b"`
|
||||||
|
}
|
||||||
|
reader := strings.NewReader(payload)
|
||||||
|
err := UnmarshalJsonReader(reader, &res)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.Equal(t, 2, len(res.B))
|
||||||
|
assert.Equal(t, 2, len(res.B[0]))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUnmarshalJsonReaderPtrArray(t *testing.T) {
|
||||||
|
payload := `{"a": "133", "b": ["add", "cccd", "eeee"]}`
|
||||||
|
var res struct {
|
||||||
|
A string `json:"a"`
|
||||||
|
B []*string `json:"b"`
|
||||||
|
}
|
||||||
|
reader := strings.NewReader(payload)
|
||||||
|
err := UnmarshalJsonReader(reader, &res)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.Equal(t, 3, len(res.B))
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user