为了账号安全,请及时绑定邮箱和手机立即绑定

通过 XML 解析 json

通过 XML 解析 json

Go
慕神8447489 2022-07-18 16:40:58
我真的不明白如何使用 Go 解析来自 Api 的响应,因为我首先看到的是 XML,然后是 Json:<?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>json
查看完整描述

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 包无法访问它们并且无法填充。


查看完整回答
反对 回复 2022-07-18
  • 1 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信