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

@ -1596,7 +1596,7 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
if fieldValue := session.getField(dataStruct, key, table, idx); fieldValue != nil { if fieldValue := session.getField(dataStruct, key, table, idx); fieldValue != nil {
rawValue := reflect.Indirect(reflect.ValueOf(scanResults[ii])) rawValue := reflect.Indirect(reflect.ValueOf(scanResults[ii]))
//if row is null then ignore // if row is null then ignore
if rawValue.Interface() == nil { if rawValue.Interface() == nil {
continue continue
} }
@ -1643,20 +1643,22 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
hasAssigned = true hasAssigned = true
if fieldValue.CanAddr() { if len(bs) > 0 {
err := json.Unmarshal(bs, fieldValue.Addr().Interface()) if fieldValue.CanAddr() {
if err != nil { err := json.Unmarshal(bs, fieldValue.Addr().Interface())
session.Engine.logger.Error(key, err) if err != nil {
return err session.Engine.logger.Error(key, err)
return err
}
} else {
x := reflect.New(fieldType)
err := json.Unmarshal(bs, x.Interface())
if err != nil {
session.Engine.logger.Error(key, err)
return err
}
fieldValue.Set(x.Elem())
} }
} else {
x := reflect.New(fieldType)
err := json.Unmarshal(bs, x.Interface())
if err != nil {
session.Engine.logger.Error(key, err)
return err
}
fieldValue.Set(x.Elem())
} }
continue continue
@ -1673,20 +1675,22 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
} }
hasAssigned = true hasAssigned = true
if fieldValue.CanAddr() { if len(bs) > 0 {
err := json.Unmarshal(bs, fieldValue.Addr().Interface()) if fieldValue.CanAddr() {
if err != nil { err := json.Unmarshal(bs, fieldValue.Addr().Interface())
session.Engine.logger.Error(err) if err != nil {
return err session.Engine.logger.Error(err)
return err
}
} else {
x := reflect.New(fieldType)
err := json.Unmarshal(bs, x.Interface())
if err != nil {
session.Engine.logger.Error(err)
return err
}
fieldValue.Set(x.Elem())
} }
} else {
x := reflect.New(fieldType)
err := json.Unmarshal(bs, x.Interface())
if err != nil {
session.Engine.logger.Error(err)
return err
}
fieldValue.Set(x.Elem())
} }
case reflect.Slice, reflect.Array: case reflect.Slice, reflect.Array:
switch rawValueType.Kind() { switch rawValueType.Kind() {
@ -1800,21 +1804,25 @@ 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)
err := json.Unmarshal([]byte(vv.String()), x.Interface()) if len([]byte(vv.String())) > 0 {
if err != nil { err := json.Unmarshal([]byte(vv.String()), x.Interface())
session.Engine.logger.Error(err) if err != nil {
return err session.Engine.logger.Error(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)
err := json.Unmarshal(vv.Bytes(), x.Interface()) if len(vv.Bytes()) > 0 {
if err != nil { err := json.Unmarshal(vv.Bytes(), x.Interface())
session.Engine.logger.Error(err) if err != nil {
return err session.Engine.logger.Error(err)
return err
}
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)
@ -1972,20 +1980,24 @@ func (session *Session) _row2Bean(rows *core.Rows, fields []string, fieldsCount
} }
case core.Complex64Type: case core.Complex64Type:
var x complex64 var x complex64
err := json.Unmarshal([]byte(vv.String()), &x) if len([]byte(vv.String())) > 0 {
if err != nil { err := json.Unmarshal([]byte(vv.String()), &x)
session.Engine.logger.Error(err) if err != nil {
} else { session.Engine.logger.Error(err)
fieldValue.Set(reflect.ValueOf(&x)) } else {
fieldValue.Set(reflect.ValueOf(&x))
}
} }
hasAssigned = true hasAssigned = true
case core.Complex128Type: case core.Complex128Type:
var x complex128 var x complex128
err := json.Unmarshal([]byte(vv.String()), &x) if len([]byte(vv.String())) > 0 {
if err != nil { err := json.Unmarshal([]byte(vv.String()), &x)
session.Engine.logger.Error(err) if err != nil {
} else { session.Engine.logger.Error(err)
fieldValue.Set(reflect.ValueOf(&x)) } else {
fieldValue.Set(reflect.ValueOf(&x))
}
} }
hasAssigned = true hasAssigned = true
} // switch fieldType } // switch fieldType
@ -2430,30 +2442,21 @@ 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())
if err != nil {
session.Engine.logger.Error(err)
return err
}
fieldValue.Set(x.Elem())
case reflect.Slice, reflect.Array, reflect.Map:
v = data
t := fieldType.Elem()
k := t.Kind()
if col.SQLType.IsText() {
x := reflect.New(fieldType)
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() { }
if k == reflect.Uint8 { case reflect.Slice, reflect.Array, reflect.Map:
fieldValue.Set(reflect.ValueOf(v)) v = data
} else { t := fieldType.Elem()
x := reflect.New(fieldType) k := t.Kind()
if col.SQLType.IsText() {
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 +2464,20 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
} }
fieldValue.Set(x.Elem()) fieldValue.Set(x.Elem())
} }
} else if col.SQLType.IsBlob() {
if k == reflect.Uint8 {
fieldValue.Set(reflect.ValueOf(v))
} else {
x := reflect.New(fieldType)
if len(data) > 0 {
err := json.Unmarshal(data, x.Interface())
if err != nil {
session.Engine.logger.Error(err)
return err
}
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
err := json.Unmarshal(data, &x) if len(data) > 0 {
if err != nil { err := json.Unmarshal(data, &x)
session.Engine.logger.Error(err) if err != nil {
return err session.Engine.logger.Error(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
err := json.Unmarshal(data, &x) if len(data) > 0 {
if err != nil { err := json.Unmarshal(data, &x)
session.Engine.logger.Error(err) if err != nil {
return err session.Engine.logger.Error(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 {