[#1703] updated json field string data normalizations and fixed the field vizualization in the Admin UI
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"regexp"
|
||||
"strconv"
|
||||
|
||||
validation "github.com/go-ozzo/ozzo-validation/v4"
|
||||
"github.com/go-ozzo/ozzo-validation/v4/is"
|
||||
@@ -279,7 +280,35 @@ func (f *SchemaField) PrepareValue(value any) any {
|
||||
case FieldTypeText, FieldTypeEmail, FieldTypeUrl, FieldTypeEditor:
|
||||
return cast.ToString(value)
|
||||
case FieldTypeJson:
|
||||
val, _ := types.ParseJsonRaw(value)
|
||||
val := value
|
||||
|
||||
if str, ok := val.(string); ok {
|
||||
// in order to support seamlessly both json and multipart/form-data requests,
|
||||
// the following normalization rules are applied for plain string values:
|
||||
// - "true" is converted to the json `true`
|
||||
// - "false" is converted to the json `false`
|
||||
// - "null" is converted to the json `null`
|
||||
// - "[1,2,3]" is converted to the json `[1,2,3]`
|
||||
// - "{\"a\":1,\"b\":2}" is converted to the json `{"a":1,"b":2}`
|
||||
// - numeric strings are converted to json number
|
||||
// - double quoted strings are left as they are (aka. without normalizations)
|
||||
// - any other string (empty string too) is double quoted
|
||||
if str == "" {
|
||||
val = strconv.Quote(str)
|
||||
} else if str == "null" || str == "true" || str == "false" {
|
||||
val = str
|
||||
} else if ((str[0] >= '0' && str[0] <= '9') ||
|
||||
str[0] == '"' ||
|
||||
str[0] == '[' ||
|
||||
str[0] == '{') &&
|
||||
is.JSON.Validate(str) == nil {
|
||||
val = str
|
||||
} else {
|
||||
val = strconv.Quote(str)
|
||||
}
|
||||
}
|
||||
|
||||
val, _ = types.ParseJsonRaw(val)
|
||||
return val
|
||||
case FieldTypeNumber:
|
||||
return cast.ToFloat64(value)
|
||||
|
||||
@@ -571,7 +571,7 @@ func TestSchemaFieldPrepareValue(t *testing.T) {
|
||||
{schema.SchemaField{Type: schema.FieldTypeUrl}, "test", `"test"`},
|
||||
{schema.SchemaField{Type: schema.FieldTypeUrl}, 123, `"123"`},
|
||||
|
||||
// text
|
||||
// editor
|
||||
{schema.SchemaField{Type: schema.FieldTypeEditor}, nil, `""`},
|
||||
{schema.SchemaField{Type: schema.FieldTypeEditor}, "", `""`},
|
||||
{schema.SchemaField{Type: schema.FieldTypeEditor}, []int{1, 2}, `""`},
|
||||
@@ -580,10 +580,29 @@ func TestSchemaFieldPrepareValue(t *testing.T) {
|
||||
|
||||
// json
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, nil, "null"},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, "null", "null"},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, 123, "123"},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, "123", "123"},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, 123.456, "123.456"},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, "123.456", "123.456"},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, "123.456 abc", `"123.456 abc"`}, // invalid numeric string
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, true, "true"},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, "true", "true"},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, false, "false"},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, "false", "false"},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, "", `""`},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, `test`, `"test"`},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, `"test"`, `"test"`},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, `{test":1}`, `"{test\":1}"`}, // invalid object string
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, `[1 2 3]`, `"[1 2 3]"`}, // invalid array string
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, map[string]int{}, `{}`},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, `{}`, `{}`},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, map[string]int{"test": 123}, `{"test":123}`},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, `{"test":123}`, `{"test":123}`},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, []int{}, `[]`},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, `[]`, `[]`},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, []int{1, 2, 1}, `[1,2,1]`},
|
||||
{schema.SchemaField{Type: schema.FieldTypeJson}, `[1,2,1]`, `[1,2,1]`},
|
||||
|
||||
// number
|
||||
{schema.SchemaField{Type: schema.FieldTypeNumber}, nil, "0"},
|
||||
|
||||
Reference in New Issue
Block a user