Embedding JSON Data into YAML file
Ruby on-RailsRubyRuby on-Rails-3JsonYamlRuby on-Rails Problem Overview
I am writing a fixture for my table. And a one of the coloums takes in a JSON string as a value.
The problem is the fixture is not loading failing as:
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'.....
Any solutions to this.
Ruby on-Rails Solutions
Solution 1 - Ruby on-Rails
I believe taking it into quotes should do the trick:
portslist: '[{"name":"ob1","port_type" ... }]'
Solution 2 - Ruby on-Rails
clarkevans' comment on the accepted answer suggested a better answer for long bits of JSON, because you can wrap the lines. I looked up the block scalar syntax he mentioned, and thought I would include an example here:
portslist: >
[{"name":"ob1","port_num":0,"port_type":"network"},
{"name":"ob2","port_nu...
Solution 3 - Ruby on-Rails
The |
is also possible. For example.
MyObject:
type: object
example: |
{
"id": 54,
"manufacturer": "ACME",
"location": "New York",
"createdAt": "2012-10-01 07:42:35.825565",
"description": "test",
}
Solution 4 - Ruby on-Rails
If you have the string, you can use as simple as Vlad Khomich mentioned:
portslist: '[{"name":"ob1","port_num":0,"port_type":"network"},...]'
If you are using ERB and have an object, you can use to_json and inspect to escape to a JSON string:
portslist: <%= [{name: 'ob1', port_num: 0, port_type: 'network'},...].to_json.inspect %>
And if you have a large JSON specification, you can store it in a separated file and load using Ruby, so you can keep your YAML file clean:
portslist: <%= File.read('/path/to/file.json').inspect %>
Solution 5 - Ruby on-Rails
For the sake of being complete: In case you're using ActiveRecord::Store
, you can load your data simply using YAML representation of the same data, even if it is a JSON store:
one:
portslist:
-
name: 'ob1'
port_num: 0
port_type: 'network'
-
name: 'ob2'
port_num: 1
port_type: 'network'
Solution 6 - Ruby on-Rails
In my table, the column stripe_connect is of type JSONB . In the fixture, here is what worked. Note that the outer single-quotes are necessary, but square brackets are not. Everything between the single quotes is one long line.
stripe_connect: '{"scope":"read_write", "livemode":false, "token_type":"bearer", "access_token":"sk_test_madeupvalue", "refresh_token":"rt_Ae29madeupvalueyX", "stripe_user_id":"acct_103yZabcdefg", "stripe_publishable_key":"pk_test_0HEOmadeupvalue"}'