【问题标题】:what is the hash structure to produce json?生成json的哈希结构是什么?
【发布时间】:2026-01-02 09:00:02
【问题描述】:

下面是我传递给 javascript 的最终 json 示例。我将使用 (yajl) ruby​​ 库从哈希创建这个 json。

问题是生成以下 json 的 ruby 哈希 应该是什么样子?

var data = [{
       data: "basics",
       attr: {},
        children: [
         {data: "login", attr: {run: "run"},
           children: [                   
           {data: "login", attr: {}}
          ]
         } ,
         {data: "Academic Year", attr: {run: "run"},
          children: [                   
           {data: "login", attr: {}},
           {data: "Academic Year", attr: {filter: "mini", SOF: "yes"}}
          ]

         }
        ]
      }];

【问题讨论】:

  • @Phrogz:@Larry 已经指出了这一点。我没有意识到这一点。谢谢你们。

标签: ruby json yajl


【解决方案1】:
  1. var 之后和; 之前复制您的代码(准确)
  2. 粘贴到 Ruby (1.9+)
    此时您已完成。为了证明...
  3. require "json"
  4. puts data.to_json

结果(带有额外的换行符):

#=> [{"data":"basics","attr":{}, "children":[
#=>    {"data":"login","attr":{"run":"run"},"children":[
#=>      {"data":"login","attr":{}}
#=>    ]},
#=>    {"data":"Academic Year","attr":{"run":"run"},"children":[
#=>      {"data":"login","attr":{}},
#=>      {"data":"Academic Year","attr":{"filter":"mini","SOF":"yes"}}
#=>    ]}
#=> ]}]

【讨论】:

  • +1 当我需要 JSON 或 YAML 版本的数据结构而不是尝试手动生成它时,我几乎都会这样做。
  • 当我复制确切的代码时,我得到 `odd number list for Hash` 。使用 ruby​​ 1.8.7 (2010-08-16 patchlevel 302) [i386-mingw32]
  • @Radek 在 Ruby 1.8.7 下,您需要修改 Ruby 源代码,以便 foo: ... 的所有实例改为显示 :foo => ...foo: bar 的 Hash 文字符号是仅在 Ruby 1.9+ 中可用的简写形式
  • 另外,Radek,如果您将代码完全复制/粘贴到 1.8.7 中,这不是您会遇到的错误,这意味着您正在做的事情不是我建议的。您可能应该为您的代码创建一个新问题或pastie
【解决方案2】:

您可以很容易地找出哪种数据结构可以自己生成 JSON:

require 'active_support'
json = '[{
       data: "basics",
       attr: {},
        children: [
         {data: "login", attr: {run: "run"},
           children: [
           {data: "login", attr: {}}
          ]
         } ,
         {data: "Academic Year", attr: {run: "run"},
          children: [
           {data: "login", attr: {}},
           {data: "Academic Year", attr: {filter: "mini", SOF: "yes"}}
          ]

         }
        ]
      }]'
puts ActiveSupport::JSON.decode(json).inspect

然后快速重新格式化输出会为您提供:

[
    {
        "data" => "basics",
        "children" => [
            {
                "data" => "login", 
                "children" => [
                    {
                        "data" => "login", 
                        "attr" => { }
                    }
                ], 
                "attr" => {
                    "run" => "run"
                }
            }, 
            {
                "data" => "Academic Year", 
                "children" => [
                    {
                        "data" => "login", 
                        "attr" => { }
                    }, 
                    {
                        "data" => "Academic Year", 
                        "attr" => {
                            "filter" => "mini", 
                            "SOF" => "yes"
                        }
                    }
                ], 
                "attr" => {
                    "run" => "run"
                }
            }
        ], 
        "attr" => { }  
    } 
]

可能有更简单的方法,但上述方法可以快速完成一次破解。

【讨论】:

  • 您能否详细说明“更简单的方法” :-) 我将根据文件目录结构和这些文件的内容动态创建哈希。我不知道如何构造这个哈希..但是如果有更简单的... :-)
  • 我发现使用常规 JSON 模块比在 Active_Support 中加载要容易得多。
  • @The Tin Man:我只使用了 Rails,因为我最近做了很多 Rails 和 JSON。 @Radek:我确实说过“可能”:) 看起来 Phrogz 有一些东西可以在没有手动格式化的情况下产生更具可读性的输出。
【解决方案3】:

你的问题不太清楚。您的意思是创建您在问题中显示的 JSON 的 Ruby 结构是什么?

如果是这样,那么您就开始吧....请注意,基层结构是 Ruby 数组,因为您的 JSON 基层结构也是一个数组。

mydata = [{
           'data' => "basics",
           'attr' => {},
           'children' => [{
                          'data' => "login",
                          'attr' => {'run' => "run"},
                          'children' => [{
                                         'data' => "login",
                                         'attr' => {}
                                        }]
                          },
                          {
                           'data' => "Academic Year",
                           'attr' => {'run' => "run"},
                           'children' => [{
                                          'data' => "login",
                                          'attr' => {}
                                          },
                                          {
                                           'data' => "Academic Year",
                                           'attr' => {'filter' => "mini", 
                                                      'SOF' => "yes"}
                                          }]
                           }]
         }]

【讨论】:

    【解决方案4】:

    我刚刚在浏览器中运行了它,它似乎是有效的 JSON。这是你的问题吗?

    【讨论】:

    • 我的问题是:可以转换成上述json的哈希应该是什么样子
    • 被否决不仅因为这错过了问题,而且因为虽然这是一个有效的 JS 文字,但它是无效的 JSON
    • @Phrogz:你能给我解释一下吗? is a valid JS literal, it is not valid JSON
    • @Radek 带有正则表达式字面量的对象字面量——{ foo:/bar/ }——是有效的 JS,但无效 JSON:JSON 不支持正则表达式。同样,很多有效的 JS 代码不是有效的 JSON。在这种情况下,JS 允许将有效标识符直接用作对象文字的属性——{ foo:42 }——但 JSON 要求它们被双引号括起来,即 { "foo":42 }