make json as interface (#1248)
This commit is contained in:
parent
1c2d47e0da
commit
5ef12eab78
|
@ -6,7 +6,6 @@ package xorm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql/driver"
|
"database/sql/driver"
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -147,7 +146,7 @@ func (engine *Engine) buildConds(table *core.Table, bean interface{},
|
||||||
} else {
|
} else {
|
||||||
if col.SQLType.IsJson() {
|
if col.SQLType.IsJson() {
|
||||||
if col.SQLType.IsText() {
|
if col.SQLType.IsText() {
|
||||||
bytes, err := json.Marshal(fieldValue.Interface())
|
bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
engine.logger.Error(err)
|
engine.logger.Error(err)
|
||||||
continue
|
continue
|
||||||
|
@ -156,7 +155,7 @@ func (engine *Engine) buildConds(table *core.Table, bean interface{},
|
||||||
} else if col.SQLType.IsBlob() {
|
} else if col.SQLType.IsBlob() {
|
||||||
var bytes []byte
|
var bytes []byte
|
||||||
var err error
|
var err error
|
||||||
bytes, err = json.Marshal(fieldValue.Interface())
|
bytes, err = DefaultJSONHandler.Marshal(fieldValue.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
engine.logger.Error(err)
|
engine.logger.Error(err)
|
||||||
continue
|
continue
|
||||||
|
@ -195,7 +194,7 @@ func (engine *Engine) buildConds(table *core.Table, bean interface{},
|
||||||
}
|
}
|
||||||
|
|
||||||
if col.SQLType.IsText() {
|
if col.SQLType.IsText() {
|
||||||
bytes, err := json.Marshal(fieldValue.Interface())
|
bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
engine.logger.Error(err)
|
engine.logger.Error(err)
|
||||||
continue
|
continue
|
||||||
|
@ -212,7 +211,7 @@ func (engine *Engine) buildConds(table *core.Table, bean interface{},
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
bytes, err = json.Marshal(fieldValue.Interface())
|
bytes, err = DefaultJSONHandler.Marshal(fieldValue.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
engine.logger.Error(err)
|
engine.logger.Error(err)
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
// Copyright 2019 The Xorm Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package xorm
|
||||||
|
|
||||||
|
import "encoding/json"
|
||||||
|
|
||||||
|
// JSONInterface represents an interface to handle json data
|
||||||
|
type JSONInterface interface {
|
||||||
|
Marshal(v interface{}) ([]byte, error)
|
||||||
|
Unmarshal(data []byte, v interface{}) error
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
// DefaultJSONHandler default json handler
|
||||||
|
DefaultJSONHandler = StdJSON{}
|
||||||
|
)
|
||||||
|
|
||||||
|
// StdJSON implements JSONInterface via encoding/json
|
||||||
|
type StdJSON struct{}
|
||||||
|
|
||||||
|
// Marshal implements JSONInterface
|
||||||
|
func (StdJSON) Marshal(v interface{}) ([]byte, error) {
|
||||||
|
return json.Marshal(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unmarshal implements JSONInterface
|
||||||
|
func (StdJSON) Unmarshal(data []byte, v interface{}) error {
|
||||||
|
return json.Unmarshal(data, v)
|
||||||
|
}
|
19
session.go
19
session.go
|
@ -7,7 +7,6 @@ package xorm
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"hash/crc32"
|
"hash/crc32"
|
||||||
|
@ -491,13 +490,13 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if fieldValue.CanAddr() {
|
if fieldValue.CanAddr() {
|
||||||
err := json.Unmarshal(bs, fieldValue.Addr().Interface())
|
err := DefaultJSONHandler.Unmarshal(bs, fieldValue.Addr().Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
x := reflect.New(fieldType)
|
x := reflect.New(fieldType)
|
||||||
err := json.Unmarshal(bs, x.Interface())
|
err := DefaultJSONHandler.Unmarshal(bs, x.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -521,13 +520,13 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b
|
||||||
hasAssigned = true
|
hasAssigned = true
|
||||||
if len(bs) > 0 {
|
if len(bs) > 0 {
|
||||||
if fieldValue.CanAddr() {
|
if fieldValue.CanAddr() {
|
||||||
err := json.Unmarshal(bs, fieldValue.Addr().Interface())
|
err := DefaultJSONHandler.Unmarshal(bs, fieldValue.Addr().Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
x := reflect.New(fieldType)
|
x := reflect.New(fieldType)
|
||||||
err := json.Unmarshal(bs, x.Interface())
|
err := DefaultJSONHandler.Unmarshal(bs, x.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -543,7 +542,7 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b
|
||||||
hasAssigned = true
|
hasAssigned = true
|
||||||
if col.SQLType.IsText() {
|
if col.SQLType.IsText() {
|
||||||
x := reflect.New(fieldType)
|
x := reflect.New(fieldType)
|
||||||
err := json.Unmarshal(vv.Bytes(), x.Interface())
|
err := DefaultJSONHandler.Unmarshal(vv.Bytes(), x.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -658,7 +657,7 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b
|
||||||
hasAssigned = true
|
hasAssigned = true
|
||||||
x := reflect.New(fieldType)
|
x := reflect.New(fieldType)
|
||||||
if len([]byte(vv.String())) > 0 {
|
if len([]byte(vv.String())) > 0 {
|
||||||
err := json.Unmarshal([]byte(vv.String()), x.Interface())
|
err := DefaultJSONHandler.Unmarshal([]byte(vv.String()), x.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -668,7 +667,7 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b
|
||||||
hasAssigned = true
|
hasAssigned = true
|
||||||
x := reflect.New(fieldType)
|
x := reflect.New(fieldType)
|
||||||
if len(vv.Bytes()) > 0 {
|
if len(vv.Bytes()) > 0 {
|
||||||
err := json.Unmarshal(vv.Bytes(), x.Interface())
|
err := DefaultJSONHandler.Unmarshal(vv.Bytes(), x.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -804,7 +803,7 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b
|
||||||
case core.Complex64Type:
|
case core.Complex64Type:
|
||||||
var x complex64
|
var x complex64
|
||||||
if len([]byte(vv.String())) > 0 {
|
if len([]byte(vv.String())) > 0 {
|
||||||
err := json.Unmarshal([]byte(vv.String()), &x)
|
err := DefaultJSONHandler.Unmarshal([]byte(vv.String()), &x)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -814,7 +813,7 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b
|
||||||
case core.Complex128Type:
|
case core.Complex128Type:
|
||||||
var x complex128
|
var x complex128
|
||||||
if len([]byte(vv.String())) > 0 {
|
if len([]byte(vv.String())) > 0 {
|
||||||
err := json.Unmarshal([]byte(vv.String()), &x)
|
err := DefaultJSONHandler.Unmarshal([]byte(vv.String()), &x)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,6 @@ package xorm
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"database/sql/driver"
|
"database/sql/driver"
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
@ -103,7 +102,7 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
|
||||||
case reflect.Complex64, reflect.Complex128:
|
case reflect.Complex64, reflect.Complex128:
|
||||||
x := reflect.New(fieldType)
|
x := reflect.New(fieldType)
|
||||||
if len(data) > 0 {
|
if len(data) > 0 {
|
||||||
err := json.Unmarshal(data, x.Interface())
|
err := DefaultJSONHandler.Unmarshal(data, x.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
session.engine.logger.Error(err)
|
session.engine.logger.Error(err)
|
||||||
return err
|
return err
|
||||||
|
@ -117,7 +116,7 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
|
||||||
if col.SQLType.IsText() {
|
if col.SQLType.IsText() {
|
||||||
x := reflect.New(fieldType)
|
x := reflect.New(fieldType)
|
||||||
if len(data) > 0 {
|
if len(data) > 0 {
|
||||||
err := json.Unmarshal(data, x.Interface())
|
err := DefaultJSONHandler.Unmarshal(data, x.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
session.engine.logger.Error(err)
|
session.engine.logger.Error(err)
|
||||||
return err
|
return err
|
||||||
|
@ -130,7 +129,7 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
|
||||||
} else {
|
} else {
|
||||||
x := reflect.New(fieldType)
|
x := reflect.New(fieldType)
|
||||||
if len(data) > 0 {
|
if len(data) > 0 {
|
||||||
err := json.Unmarshal(data, x.Interface())
|
err := DefaultJSONHandler.Unmarshal(data, x.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
session.engine.logger.Error(err)
|
session.engine.logger.Error(err)
|
||||||
return err
|
return err
|
||||||
|
@ -259,7 +258,7 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
|
||||||
case core.Complex64Type.Kind():
|
case core.Complex64Type.Kind():
|
||||||
var x complex64
|
var x complex64
|
||||||
if len(data) > 0 {
|
if len(data) > 0 {
|
||||||
err := json.Unmarshal(data, &x)
|
err := DefaultJSONHandler.Unmarshal(data, &x)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
session.engine.logger.Error(err)
|
session.engine.logger.Error(err)
|
||||||
return err
|
return err
|
||||||
|
@ -270,7 +269,7 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
|
||||||
case core.Complex128Type.Kind():
|
case core.Complex128Type.Kind():
|
||||||
var x complex128
|
var x complex128
|
||||||
if len(data) > 0 {
|
if len(data) > 0 {
|
||||||
err := json.Unmarshal(data, &x)
|
err := DefaultJSONHandler.Unmarshal(data, &x)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
session.engine.logger.Error(err)
|
session.engine.logger.Error(err)
|
||||||
return err
|
return err
|
||||||
|
@ -604,14 +603,14 @@ func (session *Session) value2Interface(col *core.Column, fieldValue reflect.Val
|
||||||
}
|
}
|
||||||
|
|
||||||
if col.SQLType.IsText() {
|
if col.SQLType.IsText() {
|
||||||
bytes, err := json.Marshal(fieldValue.Interface())
|
bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
session.engine.logger.Error(err)
|
session.engine.logger.Error(err)
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
return string(bytes), nil
|
return string(bytes), nil
|
||||||
} else if col.SQLType.IsBlob() {
|
} else if col.SQLType.IsBlob() {
|
||||||
bytes, err := json.Marshal(fieldValue.Interface())
|
bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
session.engine.logger.Error(err)
|
session.engine.logger.Error(err)
|
||||||
return 0, err
|
return 0, err
|
||||||
|
@ -620,7 +619,7 @@ func (session *Session) value2Interface(col *core.Column, fieldValue reflect.Val
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("Unsupported type %v", fieldValue.Type())
|
return nil, fmt.Errorf("Unsupported type %v", fieldValue.Type())
|
||||||
case reflect.Complex64, reflect.Complex128:
|
case reflect.Complex64, reflect.Complex128:
|
||||||
bytes, err := json.Marshal(fieldValue.Interface())
|
bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
session.engine.logger.Error(err)
|
session.engine.logger.Error(err)
|
||||||
return 0, err
|
return 0, err
|
||||||
|
@ -632,7 +631,7 @@ func (session *Session) value2Interface(col *core.Column, fieldValue reflect.Val
|
||||||
}
|
}
|
||||||
|
|
||||||
if col.SQLType.IsText() {
|
if col.SQLType.IsText() {
|
||||||
bytes, err := json.Marshal(fieldValue.Interface())
|
bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
session.engine.logger.Error(err)
|
session.engine.logger.Error(err)
|
||||||
return 0, err
|
return 0, err
|
||||||
|
@ -645,7 +644,7 @@ func (session *Session) value2Interface(col *core.Column, fieldValue reflect.Val
|
||||||
(fieldValue.Type().Elem().Kind() == reflect.Uint8) {
|
(fieldValue.Type().Elem().Kind() == reflect.Uint8) {
|
||||||
bytes = fieldValue.Bytes()
|
bytes = fieldValue.Bytes()
|
||||||
} else {
|
} else {
|
||||||
bytes, err = json.Marshal(fieldValue.Interface())
|
bytes, err = DefaultJSONHandler.Marshal(fieldValue.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
session.engine.logger.Error(err)
|
session.engine.logger.Error(err)
|
||||||
return 0, err
|
return 0, err
|
||||||
|
|
|
@ -6,7 +6,6 @@ package xorm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql/driver"
|
"database/sql/driver"
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
@ -408,7 +407,7 @@ func (statement *Statement) buildUpdates(bean interface{},
|
||||||
} else {
|
} else {
|
||||||
// Blank struct could not be as update data
|
// Blank struct could not be as update data
|
||||||
if requiredField || !isStructZero(fieldValue) {
|
if requiredField || !isStructZero(fieldValue) {
|
||||||
bytes, err := json.Marshal(fieldValue.Interface())
|
bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Sprintf("mashal %v failed", fieldValue.Interface()))
|
panic(fmt.Sprintf("mashal %v failed", fieldValue.Interface()))
|
||||||
}
|
}
|
||||||
|
@ -437,7 +436,7 @@ func (statement *Statement) buildUpdates(bean interface{},
|
||||||
}
|
}
|
||||||
|
|
||||||
if col.SQLType.IsText() {
|
if col.SQLType.IsText() {
|
||||||
bytes, err := json.Marshal(fieldValue.Interface())
|
bytes, err := DefaultJSONHandler.Marshal(fieldValue.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
engine.logger.Error(err)
|
engine.logger.Error(err)
|
||||||
continue
|
continue
|
||||||
|
@ -457,7 +456,7 @@ func (statement *Statement) buildUpdates(bean interface{},
|
||||||
fieldType.Elem().Kind() == reflect.Uint8 {
|
fieldType.Elem().Kind() == reflect.Uint8 {
|
||||||
val = fieldValue.Slice(0, 0).Interface()
|
val = fieldValue.Slice(0, 0).Interface()
|
||||||
} else {
|
} else {
|
||||||
bytes, err = json.Marshal(fieldValue.Interface())
|
bytes, err = DefaultJSONHandler.Marshal(fieldValue.Interface())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
engine.logger.Error(err)
|
engine.logger.Error(err)
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
package xorm
|
package xorm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -117,21 +116,21 @@ type ConvConfig struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ConvConfig) FromDB(data []byte) error {
|
func (s *ConvConfig) FromDB(data []byte) error {
|
||||||
return json.Unmarshal(data, s)
|
return DefaultJSONHandler.Unmarshal(data, s)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ConvConfig) ToDB() ([]byte, error) {
|
func (s *ConvConfig) ToDB() ([]byte, error) {
|
||||||
return json.Marshal(s)
|
return DefaultJSONHandler.Marshal(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
type SliceType []*ConvConfig
|
type SliceType []*ConvConfig
|
||||||
|
|
||||||
func (s *SliceType) FromDB(data []byte) error {
|
func (s *SliceType) FromDB(data []byte) error {
|
||||||
return json.Unmarshal(data, s)
|
return DefaultJSONHandler.Unmarshal(data, s)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SliceType) ToDB() ([]byte, error) {
|
func (s *SliceType) ToDB() ([]byte, error) {
|
||||||
return json.Marshal(s)
|
return DefaultJSONHandler.Marshal(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
type ConvStruct struct {
|
type ConvStruct struct {
|
||||||
|
|
Loading…
Reference in New Issue