增加解析json key和数据类型

This commit is contained in:
白茶清欢 2023-03-29 14:40:59 +08:00
parent f24fe13e4b
commit f30bf03b58
2 changed files with 142 additions and 21 deletions

View File

@ -18,10 +18,30 @@ const (
KeywordArrayEnd = "]"
// KeywordColon 冒号
KeywordColon = ":"
// KeywordDot .
KeywordDot = "."
// KeywordDoubleQuote 双引号
KeywordDoubleQuote = `"`
// 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 (
@ -33,6 +53,8 @@ const (
ValueTypeInteger = "int64"
// ValueTypeFloat float类型
ValueTypeFloat = "float64"
// ValueTypeNumber 数字
ValueTypeNumber = "number"
// ValueTypeMap map数据
ValueTypeMap = "map"
// ValueTypeArray 数组

View File

@ -7,7 +7,10 @@
// Date : 2023-03-28 18:42
package tree
import "strings"
import (
"github.com/pkg/errors"
"strings"
)
// New 生成一棵JSON树
//
@ -17,25 +20,11 @@ import "strings"
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,
}
jsonData: jsonData,
jsonDataByte: []byte(jsonData),
}
g.root = NewVirtualNode()
g.currentNode = g.root
return g
}
@ -45,8 +34,118 @@ func New(jsonData string) *Generate {
//
// Date : 22:46 2023/3/28
type Generate struct {
root *Node
jsonData string
root *Node // 根节点
currentNode *Node // 当前节点
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 整体是否为对象