diff --git a/g/encoding/gjson/gjson.go b/g/encoding/gjson/gjson.go index b504d462c..4ec3d80fc 100644 --- a/g/encoding/gjson/gjson.go +++ b/g/encoding/gjson/gjson.go @@ -21,6 +21,8 @@ import ( "gitee.com/johng/gf/g/util/gstr" "time" "gitee.com/johng/gf/g/encoding/gjson/internal/rwmutex" + "fmt" + "github.com/pkg/errors" ) const ( @@ -73,6 +75,14 @@ func New(value interface{}, safe...bool) *Json { return j } +// 创建一个非并发安全的Json对象 +func NewUnsafe(value...interface{}) *Json { + if len(value) > 0 { + return New(value[0], false) + } + return New(nil, false) +} + // 编码go变量为json字符串,并返回json字符串指针 func Encode (v interface{}) ([]byte, error) { return json.Marshal(v) @@ -508,6 +518,18 @@ func (j *Json) Get(pattern...string) interface{} { return nil } +// 指定pattern追加元素 +func (j *Json) Append(pattern string, value interface{}) error { + p := j.getPointerByPattern(pattern) + switch t := (*p).(type) { + case []interface{}: + *p = append((*p).([]interface{}), value) + return nil + default: + return errors.New(fmt.Sprintf("invalid type '%s' to append", t)) + } +} + // 根据pattern层级查找**变量指针** // 检索方式:例如检索 a.a.a ,值为1 // 1. 检索 a.a.a.a 是否存在对应map的键名; @@ -656,4 +678,16 @@ func (j *Json) ToStruct(o interface{}) error { j.mu.RLock() defer j.mu.RUnlock() return gconv.MapToStruct(j.ToMap(), o) +} + +// 打印Json对象 +func (j *Json) Dump() error { + j.mu.RLock() + defer j.mu.RUnlock() + if b, err := j.ToJsonIndent(); err != nil { + return err + } else { + fmt.Println(string(b)) + } + return nil } \ No newline at end of file diff --git a/g/util/gconv/gconv.go b/g/util/gconv/gconv.go index 0dbd8dd76..f33b56974 100644 --- a/g/util/gconv/gconv.go +++ b/g/util/gconv/gconv.go @@ -111,18 +111,71 @@ func String(i interface{}) string { } } +// 任意类型转换为[]int类型 +func Ints(i interface{}) []int { + return nil + if i == nil { + return nil + } + if r, ok := i.([]int); ok { + return r + } else { + switch i.(type) { + case []int8, []int16, []int32, []int64, + []uint, []uint8, []uint16, []uint32, []uint64, + []bool, []string, + []float32, []float64: + array := make([]int, len(r)) + for k, v := range r { + array[k] = Int(v) + } + return array + } + } + return []int{Int(i)} +} + +// 任意类型转换为[]uint类型 +func Uints(i interface{}) []uint { + return nil + if i == nil { + return nil + } + if r, ok := i.([]uint); ok { + return r + } else { + switch i.(type) { + case []int, []int8, []int16, []int32, []int64, []uint8, []uint16, []uint32, []uint64, + []bool, []string, []float32, []float64: + array := make([]uint, len(r)) + for k, v := range r { + array[k] = Uint(v) + } + return array + } + } + return []uint{Uint(i)} +} + +// 任意类型转换为[]string类型 func Strings(i interface{}) []string { + return nil if i == nil { return nil } if r, ok := i.([]string); ok { return r - } else if r, ok := i.([]interface{}); ok { - strs := make([]string, len(r)) - for k, v := range r { - strs[k] = String(v) + } else { + switch i.(type) { + case []int, []int8, []int16, []int32, []int64, + []uint, []uint8, []uint16, []uint32, []uint64, + []bool, []float32, []float64: + array := make([]string, len(r)) + for k, v := range r { + array[k] = String(v) + } + return array } - return strs } return []string{fmt.Sprintf("%v", i)} } diff --git a/g/util/gutil/gutil.go b/g/util/gutil/gutil.go index d40935fff..7e7490979 100644 --- a/g/util/gutil/gutil.go +++ b/g/util/gutil/gutil.go @@ -9,23 +9,27 @@ package gutil import ( "fmt" - "encoding/json" "bytes" + "encoding/json" ) // 格式化打印变量(类似于PHP-vardump) func Dump(i...interface{}) { for _, v := range i { - buffer := &bytes.Buffer{} - encoder := json.NewEncoder(buffer) - encoder.SetEscapeHTML(false) - encoder.SetIndent("", "\t") - if err := encoder.Encode(v); err == nil { - fmt.Print(buffer.String()) + if b, ok := v.([]byte); ok { + fmt.Print(string(b)) } else { - fmt.Errorf("%s", err.Error()) + buffer := &bytes.Buffer{} + encoder := json.NewEncoder(buffer) + encoder.SetEscapeHTML(false) + encoder.SetIndent("", "\t") + if err := encoder.Encode(v); err == nil { + fmt.Print(buffer.String()) + } else { + fmt.Errorf("%s", err.Error()) + } } + fmt.Println() } - fmt.Println() } diff --git a/geg/other/test2.go b/geg/other/test2.go index fa943700f..534c64e0f 100644 --- a/geg/other/test2.go +++ b/geg/other/test2.go @@ -1,11 +1,13 @@ package main import ( - "gitee.com/johng/gf/g/util/gutil" - "gitee.com/johng/gf/g/os/gfile" + "gitee.com/johng/gf/g/encoding/gjson" ) func main() { - gutil.Dump(gfile.ScanDir("/tmp", "*test*")) - gutil.Dump(gfile.Glob("/tmp/*", true)) + j := gjson.NewUnsafe([]int{1,2,3}) + j.Append("", 4) + j.Append("", "abc") + j.Dump() + } \ No newline at end of file