草庐IT

json - 具有嵌套属性的 Golang YAML 到 JSON

coder 2023-07-01 原文

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

我在处理包含多个/嵌套对象的数据集时遇到了一些问题。

  • 我无法解码每个文件的多个项目。
  • 我不确定如何获取嵌套属性,例如 item -> description -> en

当我运行以下代码时出现错误。

cannot unmarshal !!map into []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

最佳答案

制作结构,例如像这样:

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

关于json - 具有嵌套属性的 Golang YAML 到 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50462026/

有关json - 具有嵌套属性的 Golang YAML 到 JSON的更多相关文章

  1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  2. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  3. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  4. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  5. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  6. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  7. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  8. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  9. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  10. Ruby——嵌套类和子类是一回事吗? - 2

    下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby​​解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc

随机推荐