Golang YAML с вложенными свойствами в JSON - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь проанализировать часть YAML из файла и преобразовать каждый элемент в плоский объект JSON.

У меня возникли проблемы с наборами данных, в которых есть несколько / вложенных объектов.

  • Мне не удается разархивировать несколько элементов на файл.
  • I 'я не знаю, как получить вложенные свойства, такие как item -> description -> ru

Когда я запускаю следующий код, я получаю сообщение об ошибке.

не может разархивировать !! mapв [] 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 голосов
/ 22 мая 2018

Создайте структуры, например, так:

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{}.

...