bug fixed for json unmarshal

This commit is contained in:
Lunny Xiao 2016-05-13 15:35:30 +08:00
parent 0c3586bc28
commit 9225f21f45
4 changed files with 99 additions and 77 deletions

1
.gitignore vendored
View File

@ -26,3 +26,4 @@ vendor
*.log *.log
.vendor .vendor
temp_test.go temp_test.go
.vscode

View File

@ -1 +1 @@
xorm v0.5.4.0508 xorm v0.5.4.0513

View File

@ -1643,6 +1643,7 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
hasAssigned = true hasAssigned = true
if len(bs) > 0 {
if fieldValue.CanAddr() { if fieldValue.CanAddr() {
err := json.Unmarshal(bs, fieldValue.Addr().Interface()) err := json.Unmarshal(bs, fieldValue.Addr().Interface())
if err != nil { if err != nil {
@ -1658,6 +1659,7 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
} }
fieldValue.Set(x.Elem()) fieldValue.Set(x.Elem())
} }
}
continue continue
} }
@ -1673,6 +1675,7 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
} }
hasAssigned = true hasAssigned = true
if len(bs) > 0 {
if fieldValue.CanAddr() { if fieldValue.CanAddr() {
err := json.Unmarshal(bs, fieldValue.Addr().Interface()) err := json.Unmarshal(bs, fieldValue.Addr().Interface())
if err != nil { if err != nil {
@ -1688,6 +1691,7 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
} }
fieldValue.Set(x.Elem()) fieldValue.Set(x.Elem())
} }
}
case reflect.Slice, reflect.Array: case reflect.Slice, reflect.Array:
switch rawValueType.Kind() { switch rawValueType.Kind() {
case reflect.Slice, reflect.Array: case reflect.Slice, reflect.Array:
@ -1800,15 +1804,18 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
if rawValueType.Kind() == reflect.String { if rawValueType.Kind() == reflect.String {
hasAssigned = true hasAssigned = true
x := reflect.New(fieldType) x := reflect.New(fieldType)
if len([]byte(vv.String())) > 0 {
err := json.Unmarshal([]byte(vv.String()), x.Interface()) err := json.Unmarshal([]byte(vv.String()), x.Interface())
if err != nil { if err != nil {
session.Engine.logger.Error(err) session.Engine.logger.Error(err)
return err return err
} }
fieldValue.Set(x.Elem()) fieldValue.Set(x.Elem())
}
} else if rawValueType.Kind() == reflect.Slice { } else if rawValueType.Kind() == reflect.Slice {
hasAssigned = true hasAssigned = true
x := reflect.New(fieldType) x := reflect.New(fieldType)
if len(vv.Bytes()) > 0 {
err := json.Unmarshal(vv.Bytes(), x.Interface()) err := json.Unmarshal(vv.Bytes(), x.Interface())
if err != nil { if err != nil {
session.Engine.logger.Error(err) session.Engine.logger.Error(err)
@ -1816,6 +1823,7 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
} }
fieldValue.Set(x.Elem()) fieldValue.Set(x.Elem())
} }
}
} else if session.Statement.UseCascade { } else if session.Statement.UseCascade {
table := session.Engine.autoMapType(*fieldValue) table := session.Engine.autoMapType(*fieldValue)
if table != nil { if table != nil {
@ -1972,21 +1980,25 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
} }
case core.Complex64Type: case core.Complex64Type:
var x complex64 var x complex64
if len([]byte(vv.String())) > 0 {
err := json.Unmarshal([]byte(vv.String()), &x) err := json.Unmarshal([]byte(vv.String()), &x)
if err != nil { if err != nil {
session.Engine.logger.Error(err) session.Engine.logger.Error(err)
} else { } else {
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x))
} }
}
hasAssigned = true hasAssigned = true
case core.Complex128Type: case core.Complex128Type:
var x complex128 var x complex128
if len([]byte(vv.String())) > 0 {
err := json.Unmarshal([]byte(vv.String()), &x) err := json.Unmarshal([]byte(vv.String()), &x)
if err != nil { if err != nil {
session.Engine.logger.Error(err) session.Engine.logger.Error(err)
} else { } else {
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x))
} }
}
hasAssigned = true hasAssigned = true
} // switch fieldType } // switch fieldType
// default: // default:
@ -2430,30 +2442,34 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
switch fieldType.Kind() { switch fieldType.Kind() {
case reflect.Complex64, reflect.Complex128: case reflect.Complex64, reflect.Complex128:
x := reflect.New(fieldType) x := reflect.New(fieldType)
if len(data) > 0 {
err := json.Unmarshal(data, x.Interface()) err := json.Unmarshal(data, x.Interface())
if err != nil { if err != nil {
session.Engine.logger.Error(err) session.Engine.logger.Error(err)
return err return err
} }
fieldValue.Set(x.Elem()) fieldValue.Set(x.Elem())
}
case reflect.Slice, reflect.Array, reflect.Map: case reflect.Slice, reflect.Array, reflect.Map:
v = data v = data
t := fieldType.Elem() t := fieldType.Elem()
k := t.Kind() k := t.Kind()
if col.SQLType.IsText() { if col.SQLType.IsText() {
x := reflect.New(fieldType) x := reflect.New(fieldType)
if len(data) > 0 {
err := json.Unmarshal(data, x.Interface()) err := json.Unmarshal(data, x.Interface())
if err != nil { if err != nil {
session.Engine.logger.Error(err) session.Engine.logger.Error(err)
return err return err
} }
fieldValue.Set(x.Elem()) fieldValue.Set(x.Elem())
}
} else if col.SQLType.IsBlob() { } else if col.SQLType.IsBlob() {
if k == reflect.Uint8 { if k == reflect.Uint8 {
fieldValue.Set(reflect.ValueOf(v)) fieldValue.Set(reflect.ValueOf(v))
} else { } else {
x := reflect.New(fieldType) x := reflect.New(fieldType)
if len(data) > 0 {
err := json.Unmarshal(data, x.Interface()) err := json.Unmarshal(data, x.Interface())
if err != nil { if err != nil {
session.Engine.logger.Error(err) session.Engine.logger.Error(err)
@ -2461,6 +2477,7 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
} }
fieldValue.Set(x.Elem()) fieldValue.Set(x.Elem())
} }
}
} else { } else {
return ErrUnSupportedType return ErrUnSupportedType
} }
@ -2584,21 +2601,25 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
// case "*complex64": // case "*complex64":
case core.Complex64Type.Kind(): case core.Complex64Type.Kind():
var x complex64 var x complex64
if len(data) > 0 {
err := json.Unmarshal(data, &x) err := json.Unmarshal(data, &x)
if err != nil { if err != nil {
session.Engine.logger.Error(err) session.Engine.logger.Error(err)
return err return err
} }
fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType)) fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType))
}
// case "*complex128": // case "*complex128":
case core.Complex128Type.Kind(): case core.Complex128Type.Kind():
var x complex128 var x complex128
if len(data) > 0 {
err := json.Unmarshal(data, &x) err := json.Unmarshal(data, &x)
if err != nil { if err != nil {
session.Engine.logger.Error(err) session.Engine.logger.Error(err)
return err return err
} }
fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType)) fieldValue.Set(reflect.ValueOf(&x).Convert(fieldType))
}
// case "*float64": // case "*float64":
case core.Float64Type.Kind(): case core.Float64Type.Kind():
x, err := strconv.ParseFloat(string(data), 64) x, err := strconv.ParseFloat(string(data), 64)

View File

@ -17,7 +17,7 @@ import (
const ( const (
// Version show the xorm's version // Version show the xorm's version
Version string = "0.5.4.0508" Version string = "0.5.4.0513"
) )
func regDrvsNDialects() bool { func regDrvsNDialects() bool {