Merge branch 'master' of github.com:go-developer/gopkg
This commit is contained in:
commit
5cb1fa20d5
@ -9,6 +9,8 @@ package json
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/go-developer/gopkg/easylock"
|
"github.com/go-developer/gopkg/easylock"
|
||||||
@ -31,6 +33,8 @@ type JSONode struct {
|
|||||||
Child []*JSONode // 子节点
|
Child []*JSONode // 子节点
|
||||||
IsRoot bool // 是否根节点
|
IsRoot bool // 是否根节点
|
||||||
IsHasLastBrother bool // 在此之后是否有其他兄弟节点
|
IsHasLastBrother bool // 在此之后是否有其他兄弟节点
|
||||||
|
IsSlice bool // 是否是list
|
||||||
|
Sort int // 此属性用于 slice解析,保证最终排序是对的
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDynamicJSON 获取JSON实例
|
// NewDynamicJSON 获取JSON实例
|
||||||
@ -39,6 +43,7 @@ type JSONode struct {
|
|||||||
//
|
//
|
||||||
// Date : 10:36 下午 2021/3/10
|
// Date : 10:36 下午 2021/3/10
|
||||||
func NewDynamicJSON() *DynamicJSON {
|
func NewDynamicJSON() *DynamicJSON {
|
||||||
|
exp, _ := regexp.Compile(`\[(\d*?)]`)
|
||||||
return &DynamicJSON{
|
return &DynamicJSON{
|
||||||
root: &JSONode{
|
root: &JSONode{
|
||||||
Key: "",
|
Key: "",
|
||||||
@ -48,6 +53,7 @@ func NewDynamicJSON() *DynamicJSON {
|
|||||||
},
|
},
|
||||||
nodeCnt: 0,
|
nodeCnt: 0,
|
||||||
lock: easylock.NewLock(),
|
lock: easylock.NewLock(),
|
||||||
|
sliceExp: exp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,6 +66,7 @@ type DynamicJSON struct {
|
|||||||
root *JSONode // 节点数
|
root *JSONode // 节点数
|
||||||
nodeCnt int // 节点数量
|
nodeCnt int // 节点数量
|
||||||
lock easylock.EasyLock // 锁
|
lock easylock.EasyLock // 锁
|
||||||
|
sliceExp *regexp.Regexp // 抽取slice索引的正则
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetValue 设置节点值,如果节点不存在,创建;如果已存在,更新, 多级key使用, value 必须是基础数据类型, 如果是结构体, 需要继续添加path,多级path使用.分割
|
// SetValue 设置节点值,如果节点不存在,创建;如果已存在,更新, 多级key使用, value 必须是基础数据类型, 如果是结构体, 需要继续添加path,多级path使用.分割
|
||||||
@ -115,7 +122,11 @@ func (dj *DynamicJSON) buildTpl(root *JSONode, tplList *[]string, valList *[]int
|
|||||||
if root.IsRoot {
|
if root.IsRoot {
|
||||||
*tplList = append(*tplList, "{")
|
*tplList = append(*tplList, "{")
|
||||||
} else {
|
} else {
|
||||||
|
if root.IsSlice {
|
||||||
*tplList = append(*tplList, key+":{")
|
*tplList = append(*tplList, key+":{")
|
||||||
|
} else {
|
||||||
|
*tplList = append(*tplList, key+":{")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if root.IsHasLastBrother {
|
if root.IsHasLastBrother {
|
||||||
@ -136,8 +147,13 @@ func (dj *DynamicJSON) buildTpl(root *JSONode, tplList *[]string, valList *[]int
|
|||||||
}
|
}
|
||||||
if root.IsHasLastBrother {
|
if root.IsHasLastBrother {
|
||||||
*tplList = append(*tplList, "},")
|
*tplList = append(*tplList, "},")
|
||||||
|
} else {
|
||||||
|
if root.IsSlice {
|
||||||
|
*tplList = append(*tplList, "}]")
|
||||||
} else {
|
} else {
|
||||||
*tplList = append(*tplList, "}")
|
*tplList = append(*tplList, "}")
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return tplList, valList
|
return tplList, valList
|
||||||
}
|
}
|
||||||
@ -190,3 +206,25 @@ func (dj *DynamicJSON) createNode(parent *JSONode, key string, value interface{}
|
|||||||
_ = dj.lock.Unlock("")
|
_ = dj.lock.Unlock("")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// extraSliceIndex 抽取slice索引
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<张德满>
|
||||||
|
//
|
||||||
|
// Date : 9:37 下午 2021/3/11
|
||||||
|
func (dj *DynamicJSON) extraSliceIndex(key string) (bool, int) {
|
||||||
|
if len(key) < 3 {
|
||||||
|
// slice 至少是 [1] 格式
|
||||||
|
return false, 0
|
||||||
|
}
|
||||||
|
// 不用正则,直接字符串处理
|
||||||
|
strByte := []byte(key)
|
||||||
|
if string(strByte[0:1]) != "[" || string(strByte[len(strByte)-1:]) != "]" {
|
||||||
|
return false, 0
|
||||||
|
}
|
||||||
|
index, err := strconv.Atoi(string(strByte[1 : len(strByte)-1]))
|
||||||
|
if nil != err {
|
||||||
|
return false, 0
|
||||||
|
}
|
||||||
|
return true, index
|
||||||
|
}
|
||||||
|
@ -14,6 +14,7 @@ import (
|
|||||||
|
|
||||||
func TestJSON(t *testing.T) {
|
func TestJSON(t *testing.T) {
|
||||||
tree := NewDynamicJSON()
|
tree := NewDynamicJSON()
|
||||||
|
fmt.Println(tree.extraSliceIndex("[200]"))
|
||||||
tree.SetValue("extra.height.value", 180)
|
tree.SetValue("extra.height.value", 180)
|
||||||
tree.SetValue("extra.height.unit.use", "cm")
|
tree.SetValue("extra.height.unit.use", "cm")
|
||||||
tree.SetValue("extra.height.unit.open", "1")
|
tree.SetValue("extra.height.unit.open", "1")
|
||||||
|
Loading…
Reference in New Issue
Block a user