From 8489acbef8d2cfb3b5a62046098e28cd44bb406d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Tue, 6 May 2025 11:51:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9F=BA=E4=BA=8Egsjon?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E7=9A=84JsonRead?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abstract/json_read.go | 6 +- implement/gjson_read.go | 120 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 implement/gjson_read.go diff --git a/abstract/json_read.go b/abstract/json_read.go index 0e824e8..e2058d2 100644 --- a/abstract/json_read.go +++ b/abstract/json_read.go @@ -13,10 +13,12 @@ type IJsonRead interface { Exist(dataPath string) bool // IsNil 指定路径是否为nil IsNil(dataPath string) bool + // Type 路径数据类型 + Type(dataPath string) string // Int 转换为int类型 - Int(dataPath string) (int, error) + Int(dataPath string) (int64, error) // Uint 转换为uint类型 - Uint(dataPath string) (uint, error) + Uint(dataPath string) (uint64, error) // Float 转换为float类型 Float(dataPath string) (float64, error) // String 转换为string类型 diff --git a/implement/gjson_read.go b/implement/gjson_read.go new file mode 100644 index 0000000..57e0c01 --- /dev/null +++ b/implement/gjson_read.go @@ -0,0 +1,120 @@ +// Package implement ... +// +// Description : implement ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 2025-05-06 11:00 +package implement + +import ( + "errors" + "git.zhangdeman.cn/zhangdeman/consts" + "git.zhangdeman.cn/zhangdeman/json_filter/abstract" + "git.zhangdeman.cn/zhangdeman/json_filter/gjson_hack" + "git.zhangdeman.cn/zhangdeman/serialize" + "github.com/tidwall/gjson" +) + +// NewGjsonRead ... +func NewGjsonRead(sourceData string) abstract.IJsonRead { + return &gjsonRead{ + sourceData: sourceData, + gjsonResult: gjson.Parse(sourceData), + } +} + +type gjsonRead struct { + sourceData string + gjsonResult gjson.Result +} + +func (g *gjsonRead) Exist(dataPath string) bool { + return g.gjsonResult.Get(dataPath).Exists() +} + +func (g *gjsonRead) IsNil(dataPath string) bool { + return g.gjsonResult.Get(dataPath).Value() == nil +} + +func (g *gjsonRead) Type(dataPath string) string { + pathRes := g.gjsonResult.Get(dataPath) + if pathRes.IsObject() { // map + return consts.DataTypeMapStrAny.String() + } + if pathRes.IsArray() { // slice + return consts.DataTypeSliceAny.String() + } + if pathRes.IsBool() { // bool + return consts.DataTypeBool.String() + } + dataType := pathRes.Type + switch dataType { + case gjson.String: + return consts.DataTypeString.String() + case gjson.Number: + return consts.DataTypeFloat64.String() + case gjson.Null: + return consts.DataTypeAny.String() + case gjson.True, gjson.False: + return consts.DataTypeBool.String() + } + return consts.DataTypeAny.String() // any类型兜底 +} + +func (g *gjsonRead) Int(dataPath string) (int64, error) { + return gjson_hack.Int(g.gjsonResult.Get(dataPath)) +} + +func (g *gjsonRead) Uint(dataPath string) (uint64, error) { + return gjson_hack.Uint(g.gjsonResult.Get(dataPath)) +} + +func (g *gjsonRead) Float(dataPath string) (float64, error) { + return gjson_hack.Float64(g.gjsonResult.Get(dataPath)) +} + +func (g *gjsonRead) String(dataPath string) (string, error) { + if !g.Exist(dataPath) { + return "", errors.New(dataPath + ": not found") + } + return g.gjsonResult.Get(dataPath).String(), nil +} + +func (g *gjsonRead) Map(dataPath string) (map[string]any, error) { + var ( + err error + dataMap map[string]any + ) + if err = g.MapWithReceiver(dataPath, &dataMap); nil != err { + return map[string]any{}, err + } + return dataMap, nil +} + +func (g *gjsonRead) MapWithReceiver(dataPath string, receiver any) error { + strVal, err := g.String(dataPath) + if nil != err { + return err + } + return serialize.JSON.UnmarshalWithNumber([]byte(strVal), receiver) +} + +func (g *gjsonRead) Array(dataPath string) ([]any, error) { + var ( + err error + dataArr []any + ) + if err = g.ArrayWithReceiver(dataPath, &dataArr); nil != err { + return []any{}, err + } + return dataArr, nil +} + +func (g *gjsonRead) ArrayWithReceiver(dataPath string, receiver any) error { + strVal, err := g.String(dataPath) + if nil != err { + return err + } + return serialize.JSON.UnmarshalWithNumber([]byte(strVal), receiver) +}