优化自动生成json #3
@@ -8,8 +8,10 @@
|
|||||||
package tree
|
package tree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/pkg/errors"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
// New 生成一棵JSON树
|
// New 生成一棵JSON树
|
||||||
@@ -17,7 +19,7 @@ import (
|
|||||||
// Author : go_developer@163.com<白茶清欢>
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
//
|
//
|
||||||
// Date : 18:42 2023/3/28
|
// Date : 18:42 2023/3/28
|
||||||
func New(jsonData string) *Generate {
|
func New(jsonData string) (*Generate, error) {
|
||||||
jsonData = strings.TrimSpace(jsonData)
|
jsonData = strings.TrimSpace(jsonData)
|
||||||
g := &Generate{
|
g := &Generate{
|
||||||
jsonData: jsonData,
|
jsonData: jsonData,
|
||||||
@@ -25,7 +27,8 @@ func New(jsonData string) *Generate {
|
|||||||
}
|
}
|
||||||
g.root = NewVirtualNode()
|
g.root = NewVirtualNode()
|
||||||
g.currentNode = g.root
|
g.currentNode = g.root
|
||||||
return g
|
err := g.init()
|
||||||
|
return g, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate ...
|
// Generate ...
|
||||||
@@ -36,10 +39,49 @@ func New(jsonData string) *Generate {
|
|||||||
type Generate struct {
|
type Generate struct {
|
||||||
root *Node // 根节点
|
root *Node // 根节点
|
||||||
currentNode *Node // 当前节点
|
currentNode *Node // 当前节点
|
||||||
|
currentParentNode *Node // 当前节点的父节点
|
||||||
jsonData string
|
jsonData string
|
||||||
jsonDataByte []byte
|
jsonDataByte []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// init 初始化
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 21:23 2023/3/29
|
||||||
|
func (g *Generate) init() error {
|
||||||
|
startIndex := 0
|
||||||
|
var (
|
||||||
|
jsonKey string
|
||||||
|
err error
|
||||||
|
valueType string
|
||||||
|
)
|
||||||
|
|
||||||
|
// 获取类型
|
||||||
|
if valueType, startIndex, err = g.getValueType(startIndex); nil != err {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
g.root.ValueType = valueType
|
||||||
|
|
||||||
|
for {
|
||||||
|
if startIndex >= len(g.jsonDataByte) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取字段
|
||||||
|
if jsonKey, startIndex, err = g.getKey(startIndex); nil != err {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// 获取类型
|
||||||
|
if valueType, startIndex, err = g.getValueType(startIndex); nil != err {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fmt.Println(jsonKey, valueType, startIndex)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// getKey 获取jsonKey TODO : 转义符识别
|
// getKey 获取jsonKey TODO : 转义符识别
|
||||||
//
|
//
|
||||||
// Author : zhangdeman001@ke.com<张德满>
|
// Author : zhangdeman001@ke.com<张德满>
|
||||||
@@ -52,14 +94,18 @@ func (g *Generate) getKey(startIndex int) (string, int, error) {
|
|||||||
charStr := string(g.jsonDataByte[startIndex])
|
charStr := string(g.jsonDataByte[startIndex])
|
||||||
if charStr == KeywordSpace {
|
if charStr == KeywordSpace {
|
||||||
// 跳过空格
|
// 跳过空格
|
||||||
|
startIndex++
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if charStr == KeywordDoubleQuote && !hasStart {
|
if charStr == KeywordDoubleQuote && !hasStart {
|
||||||
// 第一次遇见双引号
|
// 第一次遇见双引号
|
||||||
|
startIndex++
|
||||||
hasStart = true
|
hasStart = true
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
if charStr == KeywordDoubleQuote && hasStart {
|
if charStr == KeywordDoubleQuote && hasStart {
|
||||||
// 第二次遇见双引号,key探寻结束
|
// 第二次遇见双引号,key探寻结束
|
||||||
|
startIndex++
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
keyCharList = append(keyCharList, charStr)
|
keyCharList = append(keyCharList, charStr)
|
||||||
@@ -76,6 +122,19 @@ func (g *Generate) getKey(startIndex int) (string, int, error) {
|
|||||||
//
|
//
|
||||||
// Date : 14:37 2023/3/29
|
// Date : 14:37 2023/3/29
|
||||||
func (g *Generate) getValueType(startIndex int) (string, int, error) {
|
func (g *Generate) getValueType(startIndex int) (string, int, error) {
|
||||||
|
if startIndex == 0 {
|
||||||
|
// 初始对象特殊处理
|
||||||
|
if string(g.jsonDataByte[0]) == KeywordArrayStart {
|
||||||
|
return ValueTypeArray, 1, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始对象特殊处理
|
||||||
|
if string(g.jsonDataByte[0]) == KeywordObjectStart {
|
||||||
|
return ValueTypeMap, 1, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", 0, errors.New("root data parse : value is invalid")
|
||||||
|
}
|
||||||
// 指针向后, 探寻到冒号之后第一个非空格字符串
|
// 指针向后, 探寻到冒号之后第一个非空格字符串
|
||||||
hasFindColon := false
|
hasFindColon := false
|
||||||
for startIndex < len(g.jsonDataByte) {
|
for startIndex < len(g.jsonDataByte) {
|
||||||
@@ -99,7 +158,7 @@ func (g *Generate) getValueType(startIndex int) (string, int, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !hasFindColon {
|
if !hasFindColon {
|
||||||
return "", startIndex, errors.New("value is invalid")
|
return "", startIndex, errors.New("check json value type : value is invalid")
|
||||||
}
|
}
|
||||||
|
|
||||||
keyValType := ""
|
keyValType := ""
|
||||||
@@ -141,7 +200,7 @@ func (g *Generate) getValueType(startIndex int) (string, int, error) {
|
|||||||
case KeywordObjectStart:
|
case KeywordObjectStart:
|
||||||
keyValType = ValueTypeMap
|
keyValType = ValueTypeMap
|
||||||
default:
|
default:
|
||||||
return "", startIndex, errors.New("value type is invalid")
|
return "", startIndex, errors.New("validate json value type : value type is invalid")
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
23
tree/generate_test.go
Normal file
23
tree/generate_test.go
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
// Package tree ...
|
||||||
|
//
|
||||||
|
// Description : tree ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2023-03-29 21:32
|
||||||
|
package tree
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNew(t *testing.T) {
|
||||||
|
jsonData := `{"name": "zhang", "age":17}`
|
||||||
|
g, err := New(jsonData)
|
||||||
|
if nil != err {
|
||||||
|
fmt.Println(err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println(g)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user