gpt4 book ai didi

xml - 戈朗 : structure to generate/parse both XML and JSON

转载 作者:IT王子 更新时间:2023-10-29 01:11:19 25 4
gpt4 key购买 nike

用例是生成(和解析)以下 XML 和 JSON,而不是为它们中的每一个创建单独的结构。

XML

<xxx xmlns="http://example.org/ns">
<data type="plaintext">Hello</data>

<field1>Something1</field1>
<field2>Something2</field2>
...
</xxx>

JSON

{
"data": "Hello",
"data_type": "plaintext",

"field1": "Something1",
"field2": "Something2"
...
}

可能的解决方案将是:

type Xxx struct {
XMLName xml.Name `xml:"http://example.org/ns xxx" json:"-"`

// **If only "inline" attribute had existed**
Data Data `xml:"data" json:",inline"`

// There are a lot of other fields here
Field1 string `xml:"field1" json:"field1"`
Field2 string `xml:"field2" json:"field2"`
...
}

type Data struct {
Value string `xml:",chardata" json:"data"`
Type string `xml:"type,attr" data_type:"data"`
}

但是,现在它生成以下 JSON:

{"Data": {"data": "Hello", "type": "plaintext"}, "field1": "Something1", "field2": "Something2"}

这不是我需要的。那么,有没有其他方法可以解决不使用单独的 xml 和 json 结构的问题?

最佳答案

解决方案是编写一个自定义的MarshalJSON(或MarshalXML)和UnmarshalJSON(或UnmarshalXML)来处理文本表示中的差异。示例:

func (x *Xxx) MarshalJSON() ([]byte, error) {
return []byte(`{"data": "` + x.Data.Value + `","type":"` + x.Data.Type + `","field1":"` + x.Field1 + `","field2":"` + x.Field2 + `"}`), nil
}

这个例子是一个粗略的演示原理的例子。为了更高效,您应该使用另一种结构来处理该过程。这个结构不需要被导出(事实上你不想导出它),只是为了在那里并被你的函数使用。示例:

type xxxJSON struct {
Data string
Type string
Field1 string
Field2 string
}

func (x *Xxx) MarshalJSON() ([]byte, error) {
out := xxxJSON{}
out.Data = x.Data.Value
out.Type = x.Data.Type
out.Field1 = x.Field1
out.Field2 = x.Field2
return json.Marshal(out)
}

关于xml - 戈朗 : structure to generate/parse both XML and JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24219545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com