将JSON数据嵌入到YAML文件中

Sau*_*eet 35 ruby json yaml ruby-on-rails ruby-on-rails-3

我正在为我的桌子写一个夹具.并且其中一个coloums将JSON字符串作为值.

问题是夹具没有加载失败,因为:

Fixture::FormatError: a YAML error occurred parsing /home/saurajeet/code/dcbox/test/fixtures/hardware.yml. Please note that YAML must be consistently indented using spaces. Tabs are not allowed. Please have a look at http://www.yaml.org/faq.html
The exact error was:
  ArgumentError: syntax error on line 145, col 73: `  portslist: [{"name":"ob1","port_num":0,"port_type":"network"},{"name":"ob2","port_nu'.....
Run Code Online (Sandbox Code Playgroud)

任何解决方案.

Vla*_*ich 45

我相信将其引入引号应该可以解决问题:

portslist: '[{"name":"ob1","port_type" ... }]'
Run Code Online (Sandbox Code Playgroud)

  • 这使得值成为一个字符串,因此它不是真正嵌入的.如果你想这样做,我会使用块标量和缩进. (4认同)
  • 是的,那么多行 JSON 呢? (2认同)

Pau*_*nch 33

clarkevans对接受的答案的评论为长篇JSON提供了更好的答案,因为你可以包装这些行.我查看了他提到的块标量语法,并认为我会在这里包含一个例子:

portslist: >
  [{"name":"ob1","port_num":0,"port_type":"network"},
  {"name":"ob2","port_nu...
Run Code Online (Sandbox Code Playgroud)

  • 这有效。但是,在 YAML 中是否有一种方法可以引用外部 JSON 文件并将其设置为 YAML 内的值? (2认同)

H6.*_*H6. 24

也是|可以的。例如。

MyObject:
  type: object
  example: |
    {
        "id": 54,
        "manufacturer": "ACME",
        "location": "New York",
        "createdAt": "2012-10-01 07:42:35.825565",
        "description": "test",
    }
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,“example”属性的**数据类型**是什么? (2认同)

mur*_*urb 8

为了完整起见:如果您正在使用ActiveRecord::Store,您可以使用相同数据的YAML表示来加载数据,即使它是JSON存储:

one:
  portslist:
    - 
      name: 'ob1'
      port_num: 0
      port_type: 'network'
    - 
      name: 'ob2'
      port_num: 1
      port_type: 'network'
Run Code Online (Sandbox Code Playgroud)


Ren*_*ves 6

如果你有字符串,你可以像Vlad Khomich提到的那样简单:

portslist: '[{"name":"ob1","port_num":0,"port_type":"network"},...]'
Run Code Online (Sandbox Code Playgroud)

如果您正在使用ERB并拥有一个对象,则可以使用to_json并检查以转义为JSON字符串:

portslist: <%= [{name: 'ob1', port_num: 0, port_type: 'network'},...].to_json.inspect %>
Run Code Online (Sandbox Code Playgroud)

如果你有一个大的JSON规范,你可以将它存储在一个单独的文件中并使用Ruby加载,这样你就可以保持你的YAML文件干净:

portslist: <%= File.read('/path/to/file.json').inspect %>
Run Code Online (Sandbox Code Playgroud)