You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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))
}

代码说明

  1. 结构体定义调整

    • 新增AddressValidateRequest结构体,通过XMLName指定外层节点名,USERID,attr标记该字段为节点属性
    • 修改Address结构体的字段为大写开头(公开字段),同时通过xml:标签指定XML节点名称,实现JSON到XML的字段映射
    • 添加Zip4字段,因为JSON中没有对应数据,只需要XML标签,序列化后会输出自闭合的<Zip4/>
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 06:50:31