优化自动生成json #3
@ -18,10 +18,30 @@ const (
|
|||||||
KeywordArrayEnd = "]"
|
KeywordArrayEnd = "]"
|
||||||
// KeywordColon 冒号
|
// KeywordColon 冒号
|
||||||
KeywordColon = ":"
|
KeywordColon = ":"
|
||||||
|
// KeywordDot .
|
||||||
|
KeywordDot = "."
|
||||||
// KeywordDoubleQuote 双引号
|
// KeywordDoubleQuote 双引号
|
||||||
KeywordDoubleQuote = `"`
|
KeywordDoubleQuote = `"`
|
||||||
// KeywordEscapeSymbol 转义符号
|
// KeywordEscapeSymbol 转义符号
|
||||||
KeywordEscapeSymbol = `\`
|
KeywordEscapeSymbol = `\`
|
||||||
|
// KeywordSpace 空格
|
||||||
|
KeywordSpace = " "
|
||||||
|
// KeywordMinus 负号
|
||||||
|
KeywordMinus = "-"
|
||||||
|
// KeywordTrueStart true的起始值
|
||||||
|
KeywordTrueStart = "t"
|
||||||
|
// KeywordFalseStart false的起始值
|
||||||
|
KeywordFalseStart = "f"
|
||||||
|
KeywordZero = "0"
|
||||||
|
KeywordOne = "1"
|
||||||
|
KeywordTwo = "2"
|
||||||
|
KeywordThree = "3"
|
||||||
|
KeywordFour = "4"
|
||||||
|
KeywordFive = "5"
|
||||||
|
KeywordSix = "6"
|
||||||
|
KeywordSeven = "7"
|
||||||
|
KeywordEight = "8"
|
||||||
|
KeywordNine = "9"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -33,6 +53,8 @@ const (
|
|||||||
ValueTypeInteger = "int64"
|
ValueTypeInteger = "int64"
|
||||||
// ValueTypeFloat float类型
|
// ValueTypeFloat float类型
|
||||||
ValueTypeFloat = "float64"
|
ValueTypeFloat = "float64"
|
||||||
|
// ValueTypeNumber 数字
|
||||||
|
ValueTypeNumber = "number"
|
||||||
// ValueTypeMap map数据
|
// ValueTypeMap map数据
|
||||||
ValueTypeMap = "map"
|
ValueTypeMap = "map"
|
||||||
// ValueTypeArray 数组
|
// ValueTypeArray 数组
|
||||||
|
137
tree/generate.go
137
tree/generate.go
@ -7,7 +7,10 @@
|
|||||||
// Date : 2023-03-28 18:42
|
// Date : 2023-03-28 18:42
|
||||||
package tree
|
package tree
|
||||||
|
|
||||||
import "strings"
|
import (
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
// New 生成一棵JSON树
|
// New 生成一棵JSON树
|
||||||
//
|
//
|
||||||
@ -18,24 +21,10 @@ func New(jsonData string) *Generate {
|
|||||||
jsonData = strings.TrimSpace(jsonData)
|
jsonData = strings.TrimSpace(jsonData)
|
||||||
g := &Generate{
|
g := &Generate{
|
||||||
jsonData: jsonData,
|
jsonData: jsonData,
|
||||||
|
jsonDataByte: []byte(jsonData),
|
||||||
}
|
}
|
||||||
if g.isArray() {
|
g.root = NewVirtualNode()
|
||||||
g.root = &Node{
|
g.currentNode = g.root
|
||||||
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
|
return g
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -45,8 +34,118 @@ func New(jsonData string) *Generate {
|
|||||||
//
|
//
|
||||||
// Date : 22:46 2023/3/28
|
// Date : 22:46 2023/3/28
|
||||||
type Generate struct {
|
type Generate struct {
|
||||||
root *Node
|
root *Node // 根节点
|
||||||
|
currentNode *Node // 当前节点
|
||||||
jsonData string
|
jsonData string
|
||||||
|
jsonDataByte []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
// getKey 获取jsonKey TODO : 转义符识别
|
||||||
|
//
|
||||||
|
// Author : zhangdeman001@ke.com<张德满>
|
||||||
|
//
|
||||||
|
// Date : 11:36 2023/3/29
|
||||||
|
func (g *Generate) getKey(startIndex int) (string, int, error) {
|
||||||
|
keyCharList := []string{}
|
||||||
|
hasStart := false
|
||||||
|
for startIndex < len(g.jsonDataByte) {
|
||||||
|
charStr := string(g.jsonDataByte[startIndex])
|
||||||
|
if charStr == KeywordSpace {
|
||||||
|
// 跳过空格
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if charStr == KeywordDoubleQuote && !hasStart {
|
||||||
|
// 第一次遇见双引号
|
||||||
|
hasStart = true
|
||||||
|
}
|
||||||
|
if charStr == KeywordDoubleQuote && hasStart {
|
||||||
|
// 第二次遇见双引号,key探寻结束
|
||||||
|
break
|
||||||
|
}
|
||||||
|
keyCharList = append(keyCharList, charStr)
|
||||||
|
startIndex++
|
||||||
|
}
|
||||||
|
jsonKey := strings.Join(keyCharList, "")
|
||||||
|
|
||||||
|
return jsonKey, startIndex, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// getValueType 获取数据类型
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 14:37 2023/3/29
|
||||||
|
func (g *Generate) getValueType(startIndex int) (string, int, error) {
|
||||||
|
// 指针向后, 探寻到冒号之后第一个非空格字符串
|
||||||
|
hasFindColon := false
|
||||||
|
for startIndex < len(g.jsonDataByte) {
|
||||||
|
charStr := string(g.jsonDataByte[startIndex])
|
||||||
|
if !hasFindColon {
|
||||||
|
if charStr == KeywordSpace {
|
||||||
|
// 跳过空格
|
||||||
|
startIndex++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if charStr != KeywordSpace {
|
||||||
|
// 非空格
|
||||||
|
if charStr != KeywordColon {
|
||||||
|
return "", startIndex, errors.New("value is invalid")
|
||||||
|
}
|
||||||
|
startIndex++
|
||||||
|
hasFindColon = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !hasFindColon {
|
||||||
|
return "", startIndex, errors.New("value is invalid")
|
||||||
|
}
|
||||||
|
|
||||||
|
keyValType := ""
|
||||||
|
// 冒号后面探寻值的类型
|
||||||
|
for startIndex < len(g.jsonDataByte) {
|
||||||
|
charStr := string(g.jsonDataByte[startIndex])
|
||||||
|
if charStr == KeywordSpace {
|
||||||
|
// 跳过空格
|
||||||
|
startIndex++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// 非空
|
||||||
|
switch charStr {
|
||||||
|
case KeywordMinus:
|
||||||
|
fallthrough
|
||||||
|
case KeywordOne:
|
||||||
|
fallthrough
|
||||||
|
case KeywordTwo:
|
||||||
|
fallthrough
|
||||||
|
case KeywordThree:
|
||||||
|
fallthrough
|
||||||
|
case KeywordFour:
|
||||||
|
fallthrough
|
||||||
|
case KeywordFive:
|
||||||
|
fallthrough
|
||||||
|
case KeywordSix:
|
||||||
|
fallthrough
|
||||||
|
case KeywordSeven:
|
||||||
|
fallthrough
|
||||||
|
case KeywordEight:
|
||||||
|
fallthrough
|
||||||
|
case KeywordNine:
|
||||||
|
keyValType = ValueTypeNumber
|
||||||
|
case KeywordDoubleQuote:
|
||||||
|
keyValType = ValueTypeString
|
||||||
|
case KeywordArrayStart:
|
||||||
|
keyValType = ValueTypeArray
|
||||||
|
case KeywordObjectStart:
|
||||||
|
keyValType = ValueTypeMap
|
||||||
|
default:
|
||||||
|
return "", startIndex, errors.New("value type is invalid")
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return keyValType, startIndex, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// isObject 整体是否为对象
|
// isObject 整体是否为对象
|
||||||
|
Loading…
x
Reference in New Issue
Block a user