Golang YAML具有JSON的嵌套属性

时间:2018-05-22 07:24:31

标签: json parsing go yaml

我试图从文件中解析一些YAML并将每个项目转换为平面JSON对象。

我对数据集存在一些问题,其中有多个/嵌套对象。

  • 我没有为每个文件解组多个项目。
  • 我不确定如何获得嵌套属性,例如item - >说明 - >烯

当我运行以下代码时,我收到错误。

  

无法解组!!映射到[] item.Item

我想我必须在我的结构中查看子类型,但我似乎无法开始工作。

任何帮助都将不胜感激。

代码:

import (
"gopkg.in/yaml.v2"
"io/ioutil"
)

func parseItemYaml() {
    filePath := "./typeIDs.yaml"

    yamlFile, err := ioutil.ReadFile(filePath)
    if err != nil {
        log.Printf("yamlFile.Get err #%v ", err)
    }

    itemData := map[int][]Item{}

    err = yaml.Unmarshal(yamlFile, &itemData)
    if err != nil {
        panic(err)
    }

    // Then convert to JSON
    // Eventual persistance
}

项目结构:

type Item struct {
    ID            int
    Name          string  `yaml:"name"`
    Description   string  `yaml:"description"`
    GroupID       int     `yaml:"groupID"`
    IconID        int     `yaml:"iconID"`
    GraphicID     int     `yaml:"graphicID"`
    MarketGroupID int     `yaml:"marketGroupID"`
    Mass          float64 `yaml:"mass"`
    Published     bool    `yaml:"published"`
    Volume        float64 `yaml:"volume"`
}

所需的JSON格式:

{
    "ID":1563,
    "Description":"Radiates an omnidirectional pulse from the ship that causes EM damage to surrounding vessels.",
    "GroupID":72,
    "IconID":112,
    "GraphicID":72,
    "MarketGroupID":382,
    "Mass":10.0,
    "Published":true,
    "Volume":12.5
},
{...},
{...}

数据子集:

1563:
    description:
        de: Ein ungerichteter Rundum-Impuls der vom Schiff ausgestrahlt wird und bei
            umliegenden Schiffen EM-Schaden verursacht.
        en: Radiates an omnidirectional pulse from the ship that causes EM damage
            to surrounding vessels.
        fr: Émet une impulsion omnidirectionelle qui part du vaisseau et provoque
            des dégâts électromagnétiques à tous les vaisseaux situés à proximité.
        ja: 全方位にパルスを放射し、周囲の艦にEMダメージを与える。
        ru: Испускает сильный всенаправленный импульс, наносящий электромагнитный
            ущерб всем объектам, окружающим корабль.
        zh: 从舰船上发射一个全向脉冲,对周围船只造成电磁伤害。
    graphicID: 2032
    groupID: 72
    iconID: 112
    marketGroupID: 382
    mass: 10.0
    name:
        de: Small EMP Smartbomb I
        en: Small EMP Smartbomb I
        fr: Petite bombe de proximité à IEM I
        ja: 小型EMPスマートボムI
        ru: Small EMP Smartbomb I
        zh: 小型EMP立体炸弹 I
    portionSize: 1
    published: true
    radius: 1000.0
    volume: 12.5
1564:
    basePrice: 650000.0
    groupID: 152
    iconID: 112
    marketGroupID: 341
    name:
        de: Small EMP Smartbomb I Blueprint
        en: Small EMP Smartbomb I Blueprint
        fr: Plan de construction Petite bombe de proximité à IEM I
        ja: 小型EMPスマートボムIブループリント
        ru: Small EMP Smartbomb I Blueprint
        zh: 小型EMP立体炸弹蓝图 I
    portionSize: 1
    published: true
    volume: 0.01
1565:
    description:
        de: Ein ungerichteter Rundum-Impuls der vom Schiff ausgestrahlt wird und bei
            umliegenden Schiffen EM-Schaden verursacht.
        en: Radiates an omnidirectional pulse from the ship that causes EM damage
            to surrounding vessels.
        fr: Émet une impulsion omnidirectionelle qui part du vaisseau et provoque
            des dégâts électromagnétiques à tous les vaisseaux situés à proximité.
        ja: 全方位にパルスを放射し、周囲の艦にEMダメージを与える。
        ru: Испускает сильный всенаправленный импульс, наносящий электромагнитный
            ущерб всем объектам, окружающим корабль.
        zh: 从舰船上发射一个全向脉冲,对周围船只造成电磁伤害。
    graphicID: 2032
    groupID: 72
    iconID: 112
    marketGroupID: 382
    mass: 40.0
    name:
        de: Small EMP Smartbomb II
        en: Small EMP Smartbomb II
        fr: Petite bombe de proximité à IEM II
        ja: 小型EMPスマートボムII
        ru: Small EMP Smartbomb II
        zh: 小型EMP立体炸弹 II
    portionSize: 1
    published: true
    radius: 1000.0
    volume: 5.0

1 个答案:

答案 0 :(得分:1)

制作结构,例如像这样:

type Language struct {
    De string `yaml:de`
    En string `yaml:en`
    Fr string `yaml:fr`
    Ja string `yaml:ja`
    Ru string `yaml:ru`
    Zh string `yaml:zh`
}

type Item struct {
    Description   Language `yaml:description`
    GroupID       int      `yaml:"groupID"`
    IconID        int      `yaml:"iconID"`
    GraphicID     int      `yaml:"graphicID"`
    MarketGroupID int      `yaml:"marketGroupID"`
    Mass          float64  `yaml:"mass"`
    Name          Language `yaml:name`
    Published     bool     `yaml:"published"`
    Volume        float64  `yaml:"volume"`
}

此外,据我所知,它应该是map[int]Item{}而不是map[int][]Item{}