fix: Fix problems with non support for multidimensional arrays and basic type pointer arrays (#778)

Co-authored-by: shaoqian <shaoqian.zhang@appshahe.com>
master
skykiss 3 years ago committed by GitHub
parent c9a2a60e28
commit 01c92a6bc5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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))
}

Loading…
Cancel
Save