gjson增加Append方法,gconv增加Ints/Uints/Strings方法

This commit is contained in:
john
2018-09-14 13:56:01 +08:00
parent cd9507780e
commit 1956313be7
4 changed files with 111 additions and 18 deletions

View File

@ -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
}

View File

@ -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)}
}

View File

@ -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()
}

View File

@ -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()
}