Fix json tag with other type #1822

Merged
lunny merged 1 commits from lunny/fix_json into master 2020-11-03 09:10:36 +00:00
7 changed files with 64 additions and 6 deletions

View File

@ -394,6 +394,60 @@ func TestJSONString(t *testing.T) {
assert.NoError(t, err)
assert.EqualValues(t, 1, len(jss))
assert.True(t, `["1","2"]` == jss[0].Content || `["1", "2"]` == jss[0].Content)
type JsonAnonymousStruct struct {
Id int64
JsonString `xorm:"'json_string' JSON LONGTEXT"`
}
assertSync(t, new(JsonAnonymousStruct))
_, err = testEngine.Insert(&JsonAnonymousStruct{
JsonString: JsonString{
Content: "1",
},
})
assert.NoError(t, err)
var jas JsonAnonymousStruct
has, err = testEngine.Get(&jas)
assert.NoError(t, err)
assert.True(t, has)
assert.EqualValues(t, 1, jas.Id)
assert.EqualValues(t, "1", jas.Content)
var jass []JsonAnonymousStruct
err = testEngine.Find(&jass)
assert.NoError(t, err)
assert.EqualValues(t, 1, len(jass))
assert.EqualValues(t, "1", jass[0].Content)
type JsonStruct struct {
Id int64
JSON JsonString `xorm:"'json_string' JSON LONGTEXT"`
}
assertSync(t, new(JsonStruct))
_, err = testEngine.Insert(&JsonStruct{
JSON: JsonString{
Content: "2",
},
})
assert.NoError(t, err)
var jst JsonStruct
has, err = testEngine.Get(&jst)
assert.NoError(t, err)
assert.True(t, has)
assert.EqualValues(t, 1, jst.Id)
assert.EqualValues(t, "2", jst.JSON.Content)
var jsts []JsonStruct
err = testEngine.Find(&jsts)
assert.NoError(t, err)
assert.EqualValues(t, 1, len(jsts))
assert.EqualValues(t, "2", jsts[0].JSON.Content)
}
func TestGetActionMapping(t *testing.T) {

View File

@ -704,7 +704,7 @@ func (statement *Statement) buildConds2(table *schemas.Table, bean interface{},
col.SQLType.IsBlob() || col.SQLType.Name == schemas.TimeStampz) {
continue
}
if col.SQLType.IsJson() {
if col.IsJSON {
continue
}
@ -813,7 +813,7 @@ func (statement *Statement) buildConds2(table *schemas.Table, bean interface{},
continue
}
} else {
if col.SQLType.IsJson() {
if col.IsJSON {
if col.SQLType.IsText() {
bytes, err := json.DefaultJSONHandler.Marshal(fieldValue.Interface())
if err != nil {

View File

@ -204,7 +204,7 @@ func (statement *Statement) BuildUpdates(tableValue reflect.Value,
continue
}
} else {
if !col.SQLType.IsJson() {
if !col.IsJSON {
table, err := statement.tagParser.ParseWithCache(fieldValue)
if err != nil {
val = fieldValue.Interface()

View File

@ -86,7 +86,7 @@ func (statement *Statement) Value2Interface(col *schemas.Column, fieldValue refl
return t.Float64, nil
}
if !col.SQLType.IsJson() {
if !col.IsJSON {
// !<winxxp>! 增加支持driver.Valuer接口的结构如sql.NullString
if v, ok := fieldValue.Interface().(driver.Valuer); ok {
return v.Value()

View File

@ -51,6 +51,7 @@ type Column struct {
func NewColumn(name, fieldName string, sqlType SQLType, len1, len2 int, nullable bool) *Column {
return &Column{
Name: name,
IsJSON: sqlType.IsJson(),
TableName: "",
FieldName: fieldName,
SQLType: sqlType,

View File

@ -503,7 +503,7 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b
fieldType := fieldValue.Type()
hasAssigned := false
if col.SQLType.IsJson() {
if col.IsJSON {
var bs []byte
if rawValueType.Kind() == reflect.String {
bs = []byte(vv.String())
@ -683,7 +683,7 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b
session.engine.logger.Errorf("sql.Sanner error: %v", err)
hasAssigned = false
}
} else if col.SQLType.IsJson() {
} else if col.IsJSON {
if rawValueType.Kind() == reflect.String {
hasAssigned = true
x := reflect.New(fieldType)

View File

@ -226,6 +226,9 @@ func CommentTagHandler(ctx *Context) error {
// SQLTypeTagHandler describes SQL Type tag handler
func SQLTypeTagHandler(ctx *Context) error {
ctx.col.SQLType = schemas.SQLType{Name: ctx.tagName}
if strings.EqualFold(ctx.tagName, "JSON") {
ctx.col.IsJSON = true
}
if len(ctx.params) > 0 {
if ctx.tagName == schemas.Enum {
ctx.col.EnumOptions = make(map[string]int)