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

XML 转换成 JSON 多重嵌套

XML 转换成 JSON 多重嵌套

Go
慕侠2389804 2022-01-10 10:45:02
我正在尝试编写将 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。有没有办法以某种方式创建各种地图的地图?任何和所有的想法都非常感谢,因为我现在很困惑,谢谢你的时间!
查看完整描述

1 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

您可以使用结构或地图映射。我将给出两者的一些例子,从地图的地图开始。该类型将被声明为;


CurrentObservation map[string]map[string]string `json:"current_observation"`

在这种情况下,您有一个以字符串作为键的映射,而值是另一个同时具有键和值的字符串的映射。结果,当你编组你的 json 时,你最终会得到类似的东西;


"current_observation" {

     "image": { // first level where the value is a map[string]string

          "title":"Weather Underground" // inner map, string to string

      }

}

如果说你只想打印标题,你会这样做;


fmt.Println(reportJson.CurrentObservation["image"]["title"])

由于那里的数据看起来相当静态,您也可以使用结构来代替。在这种情况下,你会使用这样的东西;


CurrentObservation CurrentObservation `json:"current_observation"`


type CurrentObservation struct {

    Image Image `json:"image"`

}


type Image struct {

    Url string `json:"url"`

    Title string `json:"title"`

    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 {

    fmt.Println(CurrentObservation.Image.Title)

}

使用地图,您基本上具有相同的开销,只是您检查键是否存在,而不是检查内部结构之一是否为 nil。


编辑:使用复合文字语法初始化地图的示例;


   reportJson.CurrentObservation := map[string]map[string]string {

           "display_location": map[string]string {

                "full": report.Full,

                "state_name": report.StateName,

            },

    }


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

添加回答

举报

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