XML 转换成 JSON 多重嵌套

我正在尝试编写将 XML 转换为 JSON 的代码。我要翻译的 XML 如下...


(只是一个片段)


`<version>0.1</version>

    <termsofService>http://www.wunderground.com/weather/api/d/terms.html</termsofService>

    <features>

        <feature>conditions</feature>

    </features>

  <current_observation>

        <image>

        <url>http://icons.wxug.com/graphics/wu2/logo_130x80.png</url>

        <title>Weather Underground</title>

        <link>http://www.wunderground.com</link>

        </image>

        <display_location>

        <full>Kearney, MO</full>

        <city>Kearney</city>

        <state>MO</state>

        <state_name>Missouri</state_name>`

如您所见,我正在使用地图来映射一级嵌套,例如在features案例中。但是对于两级嵌套情况,例如xml:"current_observation>display_location>state_name",我无法弄清楚如何创建第一级,在这种情况下current_observations。有没有办法以某种方式创建各种地图的地图?任何和所有的想法都非常感谢,因为我现在很困惑,谢谢你的时间!



慕侠2389804
浏览 208回答 1
1回答

湖上湖

您可以使用结构或地图映射。我将给出两者的一些例子,从地图的地图开始。该类型将被声明为;CurrentObservation map[string]map[string]string `json:"current_observation"`在这种情况下,您有一个以字符串作为键的映射,而值是另一个同时具有键和值的字符串的映射。结果,当你编组你的 json 时,你最终会得到类似的东西;"current_observation" {&nbsp; &nbsp; &nbsp;"image": { // first level where the value is a map[string]string&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "title":"Weather Underground" // inner map, string to string&nbsp; &nbsp; &nbsp; }}如果说你只想打印标题,你会这样做;fmt.Println(reportJson.CurrentObservation["image"]["title"])由于那里的数据看起来相当静态,您也可以使用结构来代替。在这种情况下,你会使用这样的东西;CurrentObservation CurrentObservation `json:"current_observation"`type CurrentObservation struct {&nbsp; &nbsp; Image Image `json:"image"`}type Image struct {&nbsp; &nbsp; Url string `json:"url"`&nbsp; &nbsp; Title string `json:"title"`&nbsp; &nbsp; Link string `json:"link"`}这两个选项产生相同的输出,尽管它们对于不同的输入可能表现不同。例如,如果current_observation接收到另一个版本的作为输入,例如其中有另一个嵌套项,则调用它...previous_observation然后 map 选项将自动解组此数据以及结构选项将排除它的位置,因为没有映射到Go 中的任何对象/类型。就我个人而言,如果可能的话,我更喜欢 struct 路线,但它因情况而异。对于您的应用程序,地图可能会更好,因为您不使用输入(它以 xml 形式出现)并且您只想打印它current_observation,如果它有 3 个对象,您实际上不必处理的细节在其中,它们都会按预期输出,如果是 5 则相同。使用结构,您必须显式定义每个字段,如果您只是转换输入,这并不是真正必要的。struct 的优点是更多地用于以后有类型安全的地方,尽管在这种情况下,我会说它们仍然相当等价,因为例如任何时候你想访问图像中的东西,就像CurrentObservation.Image.Title你必须执行一个检查以确保 Image 不为零,例如;if CurrentObservation.Image != nil {&nbsp; &nbsp; fmt.Println(CurrentObservation.Image.Title)}使用地图,您基本上具有相同的开销,只是您检查键是否存在,而不是检查内部结构之一是否为 nil。编辑:使用复合文字语法初始化地图的示例;&nbsp; &nbsp;reportJson.CurrentObservation := map[string]map[string]string {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"display_location": map[string]string {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "full": report.Full,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "state_name": report.StateName,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go