diff --git a/tree/consts.go b/tree/consts.go index 5d66254..203b24c 100644 --- a/tree/consts.go +++ b/tree/consts.go @@ -27,6 +27,8 @@ const ( const ( // ValueTypeString 字符串类型 ValueTypeString = "string" + // ValueTypeBool bool类型 + ValueTypeBool = "bool" // ValueTypeInteger int类型 ValueTypeInteger = "int64" // ValueTypeFloat float类型 @@ -36,3 +38,12 @@ const ( // ValueTypeArray 数组 ValueTypeArray = "array" ) + +// isBaseDataType 是否为基础数据类型 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 23:16 2023/3/28 +func isBaseDataType(valueType string) bool { + return valueType != ValueTypeArray && valueType != ValueTypeMap +} diff --git a/tree/generate.go b/tree/generate.go index c423ede..09a7160 100644 --- a/tree/generate.go +++ b/tree/generate.go @@ -7,11 +7,62 @@ // Date : 2023-03-28 18:42 package tree +import "strings" + // New 生成一棵JSON树 // // Author : go_developer@163.com<白茶清欢> // // Date : 18:42 2023/3/28 -func New(jsonData string) *Node { - return nil +func New(jsonData string) *Generate { + jsonData = strings.TrimSpace(jsonData) + g := &Generate{ + jsonData: jsonData, + } + if g.isArray() { + g.root = &Node{ + IsVirtual: true, + Value: nil, + ValueType: "", + Key: "", + Show: false, + ShowKey: "", + AllowEdit: false, + AllowChangeType: false, + DefaultValue: nil, + ParentNode: nil, + PreBrotherNode: nil, + LastBrotherNode: nil, + SonNodeList: nil, + } + } + return g +} + +// Generate ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 22:46 2023/3/28 +type Generate struct { + root *Node + jsonData string +} + +// isObject 整体是否为对象 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 22:51 2023/3/28 +func (g *Generate) isObject() bool { + return strings.HasPrefix(g.jsonData, KeywordObjectStart) +} + +// isArray 整体是否为数组 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 22:51 2023/3/28 +func (g *Generate) isArray() bool { + return strings.HasPrefix(g.jsonData, KeywordArrayStart) } diff --git a/tree/node.go b/tree/node.go index bf8cfdb..52f32a4 100644 --- a/tree/node.go +++ b/tree/node.go @@ -7,6 +7,12 @@ // Date : 2023-03-28 18:12 package tree +import ( + "strings" + + "git.zhangdeman.cn/zhangdeman/util" +) + // Node 节点的数据结构 // // Author : go_developer@163.com<白茶清欢> @@ -27,3 +33,70 @@ type Node struct { LastBrotherNode *Node // 下一个兄弟节点 SonNodeList []*Node // 子节点列表 } + +// NewNode 创建新节点 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 23:02 2023/3/28 +func NewNode(key string, value string, valueType string, parentNode *Node) *Node { + n := &Node{ + IsVirtual: false, + Value: value, + ValueType: valueType, + Key: key, + Show: false, + ShowKey: "", + AllowEdit: false, + AllowChangeType: false, + DefaultValue: nil, + ParentNode: parentNode, + PreBrotherNode: nil, + LastBrotherNode: nil, + SonNodeList: nil, + } + + switch valueType { + case ValueTypeString: + n.Value = value + case ValueTypeInteger: + var v int64 + _ = util.ConvertAssign(&v, value) + n.Value = v + case ValueTypeFloat: + var v float64 + _ = util.ConvertAssign(&v, value) + n.Value = v + case ValueTypeBool: + n.Value = strings.ToLower(value) == "true" + case ValueTypeMap: + n.Value = map[string]interface{}{} + n.SonNodeList = make([]*Node, 0) + case ValueTypeArray: + n.Value = []interface{}{} + n.SonNodeList = make([]*Node, 0) + } + + // 处理 preBrother 和 lastBrother + if parentNode.ValueType == ValueTypeMap || parentNode.ValueType == ValueTypeArray { + // map 和 array 才有所谓的兄弟节点 + if len(parentNode.SonNodeList) > 0 { + // 设置新节点的 pre 节点 + n.PreBrotherNode = parentNode.SonNodeList[len(parentNode.SonNodeList)-1] + // 设置当前最后一个节点的 last 节点 + parentNode.SonNodeList[len(parentNode.SonNodeList)-1].LastBrotherNode = n + } + // 新节点追加到子节点末尾 + parentNode.SonNodeList = append(parentNode.SonNodeList, n) + } + return n +} + +// NewVirtualNode 创建一个新的虚拟节点 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 23:08 2023/3/28 +func NewVirtualNode() *Node { + return &Node{IsVirtual: true, SonNodeList: make([]*Node, 0)} +}