支持通过配置传入XmlName, 默认值 XmlData

This commit is contained in:
白茶清欢 2025-04-28 17:40:40 +08:00
parent f9024b9498
commit b4932bf7cd
3 changed files with 25 additions and 3 deletions

View File

@ -10,12 +10,13 @@ package wrapper
import ( import (
"encoding/xml" "encoding/xml"
"errors" "errors"
"fmt"
dynamicstruct "git.zhangdeman.cn/zhangdeman/dynamic-struct" dynamicstruct "git.zhangdeman.cn/zhangdeman/dynamic-struct"
"git.zhangdeman.cn/zhangdeman/serialize" "git.zhangdeman.cn/zhangdeman/serialize"
"github.com/tidwall/gjson" "github.com/tidwall/gjson"
) )
func NewJson(sourceData string) (*ownJson, error) { func NewJson(sourceData string, o *Option) (*ownJson, error) {
gjsonRes := gjson.Parse(sourceData) gjsonRes := gjson.Parse(sourceData)
if gjsonRes.Value() == nil { if gjsonRes.Value() == nil {
return nil, errors.New("source data parse result is nil") return nil, errors.New("source data parse result is nil")
@ -24,10 +25,17 @@ func NewJson(sourceData string) (*ownJson, error) {
if !gjsonRes.IsObject() { if !gjsonRes.IsObject() {
return nil, errors.New("source result is not map or struct Marshal string") 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{ oj := &ownJson{
sourceData: sourceData, sourceData: sourceData,
gjsonResult: gjsonRes, gjsonResult: gjsonRes,
structBuilder: dynamicstruct.NewStruct(nil), structBuilder: dynamicstruct.NewStruct(nil),
o: o,
} }
if err := oj.GenerateStruct(); nil != err { if err := oj.GenerateStruct(); nil != err {
return nil, err return nil, err
@ -40,6 +48,7 @@ type ownJson struct {
gjsonResult gjson.Result // 数据源解析为gjson gjsonResult gjson.Result // 数据源解析为gjson
structBuilder dynamicstruct.IBuilder // 结构体构造器 structBuilder dynamicstruct.IBuilder // 结构体构造器
structRes any // 解析的结构体值 structRes any // 解析的结构体值
o *Option // 一些操作选项
} }
// GenerateStruct 生成结构体字段列表 // GenerateStruct 生成结构体字段列表
@ -49,7 +58,7 @@ func (oj *ownJson) GenerateStruct() error {
return true return true
}) })
// 追加xml的标签 // 追加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() val := oj.structBuilder.Build().New()
if err := serialize.JSON.UnmarshalWithNumber([]byte(oj.sourceData), &val); nil != err { if err := serialize.JSON.UnmarshalWithNumber([]byte(oj.sourceData), &val); nil != err {
return err return err

View File

@ -14,7 +14,7 @@ import (
func TestNewJson(t *testing.T) { func TestNewJson(t *testing.T) {
sourceData := `{"name": "test", "age":18,"company":{"address": "Beijing", "name":"lala"},"index":[1,2,3,4], "deep":[{"name":"a"}]}` 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) fmt.Println(iErr)
res, err := instance.Marshal("xml") res, err := instance.Marshal("xml")
fmt.Println(err) fmt.Println(err)

13
wrapper/option.go Normal file
View File

@ -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作为根节点
}