【问题标题】:Parsing json over XML [closed]通过 XML 解析 json [关闭]
【发布时间】:2020-12-08 13:36:50
【问题描述】:

我真的不明白如何使用 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>

【问题讨论】:

  • 你试过什么?包括您的代码。你遇到了什么问题?
  • “我先看到XML,然后是Json” 然后先解析为XML,再解析为JSON。
  • 因为我刚学 Golang,我还没有找到正确的方法
  • 一次做/学习一个。首先查找如何解析 XML 的教程。一旦你这样做了并且你有了 JSON 值,然后就好像你只有一个 JSON 一样。 Go 解析 XML 和 JSON 的例子很多。
  • 我从 String struct 类型的描述开始,但我不太明白如何正确描述它,所以如果它是一个常规 XLM,那不是问题

标签: json xml parsing go


【解决方案1】:

以下代码将首先解组xml,然后解组structText 字段中的jsonxml 已解组。下面是指向 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)
}

Go playground

注意:jsonStructure 类型仍然缺少您示例中的某些字段。

注意 2:由于您是 Go 新手:

问题的关键在于struct字段后面的xml和json标签。它们必须与您获得的 xml/json 输入的字段名称相匹配。对于 xml,有一些特殊情况,例如将结构与 xml 标记匹配所需的 xml.Name 类型。 (由此整个xmlStructure 结构与输入中的string 标记匹配。)XMLNS 字段后面的xml:"xmlns,attr" 告诉xml 包在@987654335 中查找名为xmlns 的属性@ 标签。 xml:",chardata" 中缺少的名称告诉 xml 选择 string 标记的内容。

json 标签更简单,只在输入中说明匹配的名称。

还要注意,结构体的字段本身必须导出,否则xml/json包无法访问,无法填充。

【讨论】:

  • 我添加了更多解释:)
  • 谢谢你,我看了你的解释,对我帮助很大
猜你喜欢
  • 1970-01-01
  • 2013-10-21
  • 2023-03-17
  • 2010-09-22
  • 2010-11-05
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多