Go语言JSON转XML未生成预期格式,请求技术指导
解决Go语言JSON转指定XML格式的问题
问题分析
你的代码当前存在几个关键问题导致无法得到预期XML:
Address结构体中city、state、zipcode是小写字段,Go中包私有字段无法被encoding/xml包序列化,所以这些字段没有出现在输出里- 缺少预期的外层
<AddressValidateRequest>结构,以及该节点的USERID属性 - JSON字段和XML节点名称不匹配(比如
city对应XML的<City>,zipcode对应<Zip5>) - 缺少预期的
<Zip4/>空节点 - 没有输出XML声明,且XML内容没有格式化缩进
修改后的代码
package main import ( "encoding/json" "encoding/xml" "fmt" ) // AddressValidateRequest 对应外层XML节点 type AddressValidateRequest struct { XMLName xml.Name `xml:"AddressValidateRequest"` USERID string `xml:"USERID,attr"` Address Address `xml:"Address"` } // Address 对应内层Address节点,同时处理JSON和XML的字段映射 type Address struct { Address1 string `json:"Address1" xml:"Address1"` Address2 string `json:"Address2" xml:"Address2"` City string `json:"city" xml:"City"` State string `json:"state" xml:"State"` Zip5 string `json:"zipcode" xml:"Zip5"` Zip4 string `xml:"Zip4"` // JSON中没有该字段,所以只加XML标签 } func main() { jsonData := `{ "Address1": "777 Brockton Avenue", "Address2": "string", "city": "Abington", "state": "MA", "zipcode": "2351" }` var addr Address err := json.Unmarshal([]byte(jsonData), &addr) if err != nil { panic(err) } // 构建外层请求结构 request := AddressValidateRequest{ USERID: "702DIGIT27hfgjkf41", Address: addr, } // 输出XML声明,并用MarshalIndent格式化带缩进的XML fmt.Println(xml.Header) xmlData, err := xml.MarshalIndent(request, "", " ") if err != nil { panic(err) } fmt.Println(string(xmlData)) }
代码说明
结构体定义调整
- 新增
AddressValidateRequest结构体,通过XMLName指定外层节点名,USERID,attr标记该字段为节点属性 - 修改
Address结构体的字段为大写开头(公开字段),同时通过xml:标签指定XML节点名称,实现JSON到XML的字段映射 - 添加
Zip4字段,因为JSON中没有对应数据,只需要XML标签,序列化后会输出自闭合的<Zip4/>
- 新增
XML输出优化
- 使用
xml.Header输出标准的<?xml version="1.0"?>声明 - 用
xml.MarshalIndent替代xml.Marshal,生成带缩进的格式化XML,更符合预期格式
- 使用
运行输出
<?xml version="1.0"?> <AddressValidateRequest USERID="702DIGIT27hfgjkf41"> <Address> <Address1>777 Brockton Avenue</Address1> <Address2>string</Address2> <City>Abington</City> <State>MA</State> <Zip5>2351</Zip5> <Zip4/> </Address> </AddressValidateRequest>
内容的提问来源于stack exchange,提问作者Sindhu1990
相关产品推荐
相关产品推荐

