From b4932bf7cd2e181ab32ba4e1d9496e9c2a8400f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Mon, 28 Apr 2025 17:40:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=80=9A=E8=BF=87=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E4=BC=A0=E5=85=A5XmlName,=20=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=80=BC=20XmlData?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wrapper/json.go | 13 +++++++++++-- wrapper/json_test.go | 2 +- wrapper/option.go | 13 +++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 wrapper/option.go diff --git a/wrapper/json.go b/wrapper/json.go index 0a6dd8f..d44aa20 100644 --- a/wrapper/json.go +++ b/wrapper/json.go @@ -10,12 +10,13 @@ package wrapper import ( "encoding/xml" "errors" + "fmt" dynamicstruct "git.zhangdeman.cn/zhangdeman/dynamic-struct" "git.zhangdeman.cn/zhangdeman/serialize" "github.com/tidwall/gjson" ) -func NewJson(sourceData string) (*ownJson, error) { +func NewJson(sourceData string, o *Option) (*ownJson, error) { gjsonRes := gjson.Parse(sourceData) if gjsonRes.Value() == nil { return nil, errors.New("source data parse result is nil") @@ -24,10 +25,17 @@ func NewJson(sourceData string) (*ownJson, error) { if !gjsonRes.IsObject() { return nil, errors.New("source result is not map or struct Marshal string") } + if nil == o { + o = &Option{} + } + if o.XmlName == "" { + o.XmlName = "XmlData" + } oj := &ownJson{ sourceData: sourceData, gjsonResult: gjsonRes, structBuilder: dynamicstruct.NewStruct(nil), + o: o, } if err := oj.GenerateStruct(); nil != err { return nil, err @@ -40,6 +48,7 @@ type ownJson struct { gjsonResult gjson.Result // 数据源解析为gjson structBuilder dynamicstruct.IBuilder // 结构体构造器 structRes any // 解析的结构体值 + o *Option // 一些操作选项 } // GenerateStruct 生成结构体字段列表 @@ -49,7 +58,7 @@ func (oj *ownJson) GenerateStruct() error { return true }) // 追加xml的标签 - oj.structBuilder.AddField("XMLName", "", xml.Name{}, `json:"-" xml:"XmlData"`, false) + oj.structBuilder.AddField("XMLName", "", xml.Name{}, fmt.Sprintf(`json:"-" toml:"-" yml:"-" init:"-" xml:"%v"`, oj.o.XmlName), false) val := oj.structBuilder.Build().New() if err := serialize.JSON.UnmarshalWithNumber([]byte(oj.sourceData), &val); nil != err { return err diff --git a/wrapper/json_test.go b/wrapper/json_test.go index 6d676bf..9625a8a 100644 --- a/wrapper/json_test.go +++ b/wrapper/json_test.go @@ -14,7 +14,7 @@ import ( func TestNewJson(t *testing.T) { sourceData := `{"name": "test", "age":18,"company":{"address": "Beijing", "name":"lala"},"index":[1,2,3,4], "deep":[{"name":"a"}]}` - instance, iErr := NewJson(sourceData) + instance, iErr := NewJson(sourceData, &Option{XmlName: "ResponseData"}) fmt.Println(iErr) res, err := instance.Marshal("xml") fmt.Println(err) diff --git a/wrapper/option.go b/wrapper/option.go new file mode 100644 index 0000000..48c057c --- /dev/null +++ b/wrapper/option.go @@ -0,0 +1,13 @@ +// Package wrapper ... +// +// Description : wrapper ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 2025-04-28 17:35 +package wrapper + +// Option 生成结构体之后的可用选项 +type Option struct { + XmlName string `json:"xml_name"` // 如果目标格式是 xml, 必须指定xmlName作为根节点 +}