1 回答
TA贡献1825条经验 获得超6个赞
以下代码将xml首先解组,然后解组被解组json的Text字段中struct的xml。下面是指向 Playground 的链接,您可以在其中运行示例并使用它。
package main
import (
"encoding/json"
"encoding/xml"
"fmt"
"log"
)
type xmlStructure struct {
XMLName xml.Name `xml:"string"`
Text string `xml:",chardata"`
XMLNS string `xml:"xmlns,attr"`
}
type jsonStructure struct {
Error string `json:"error"`
ClassMan string `json:"class_man"`
LogoPath string `json:"logo_path"`
PartNumber string `json:"part_number"`
ClassCat string `json:"class_cat"`
// etc.
}
func main() {
var input = `<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://www.zzap.ru/">{"error":"","class_man":"MITSUBISHI","logopath":"https://koj.blob.core.windows.net/zzap-upload/upload/logos/se12d7724469c1dbbe07e303ac6e91b48.png","partnumber":"MR245368","class_cat":"windscreen washer motor","imagepath":"","code_cat":1116901944,"class_cur":"р.","price_count_instock":24,"price_min_instock":200.0,"price_avg_instock":810.0,"price_max_instock":1380.0,"price_count_order":457,"price_min_order":201.0,"price_avg_order":1079.0,"price_max_order":8004.0,"imagepathV2":[""],"code_man":3113}</string>`
var in xmlStructure
if err := xml.Unmarshal([]byte(input), &in); err != nil {
log.Fatal(err)
}
var msg jsonStructure
if err := json.Unmarshal([]byte(in.Text), &msg); err != nil {
log.Fatal(err)
}
fmt.Printf("%+v", msg)
}
去游乐场
注意:该jsonStructure类型仍然缺少您示例中的某些字段。
注2:由于您是 Go 新手:
问题的关键在于struct字段后面的xml和json标签。它们必须与您获得的 xml/json 输入的字段名称相匹配。对于 xml,有一些特殊情况,例如将xml.Name结构与 xml 标签匹配所需的类型。(通过这种方式,整个xmlStructure结构与string输入中的标签匹配。)xml:"xmlns,attr"该字段的后面还告诉 xml 包查找标签中XMLNS调用的属性xmlns。string中缺少的名称xml:",chardata"告诉 xml 选择string标签的内容。
标签更简单,仅在json输入中说明匹配的名称。
另请注意,结构的字段本身必须导出,否则 xml/json 包无法访问它们并且无法填充。
- 1 回答
- 0 关注
- 118 浏览
添加回答
举报