2012-03-02 22 views
23

Estoy escribiendo un accesorio para mi mesa. Y uno de los coloums toma una cadena JSON como valor.Incrustar datos JSON en el archivo YAML

El problema es el accesorio no está cargando en su defecto como:

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'..... 

Cualquier soluciones a este.

+0

¿Tiene un pegado exacto del archivo problemático? ¿Qué procesador estás usando? El informe de error es que tiene un carácter * TAB *, por lo que es un problema muy específico. – clarkevans

Respuesta

28

Creo al tomarla entre comillas debe hacer el truco: comentario

portslist: '[{"name":"ob1","port_type" ... }]' 
+0

tan obvio ... intenté escapar de los símbolos especiales ... :( – Saurajeet

+2

Esto hace que el valor sea una cadena, por lo que no está realmente incrustado. Si quieres hacer esto, usaría un escalar de bloque y una sangría. – clarkevans

+0

Las cadenas son tipo escalar, pero entiendo lo que quieres decir. – Thermatix

21

clarkevans' en la respuesta aceptada sugiere una mejor respuesta por largos trozos de JSON, porque se puede envolver las líneas. Busqué la sintaxis del bloque escalar mencionó, y pensaba que iba a incluir un ejemplo aquí:

portslist: > 
    [{"name":"ob1","port_num":0,"port_type":"network"}, 
    {"name":"ob2","port_nu... 
6

Si usted tiene la cadena, puede utilizar tan simple como se ha mencionado Vlad Khomich:

portslist: '[{"name":"ob1","port_num":0,"port_type":"network"},...]' 

Si está utilizando ERB y tiene un objeto, puede utilizar a_json e inspeccionar para escapar a una cadena JSON:

portslist: <%= [{name: 'ob1', port_num: 0, port_type: 'network'},...].to_json.inspect %> 

y si usted tiene una especificación JSON grande, se puede almacenar en un archivo separado y carga usando Ruby, para que pueda mantener su archivo YAML limpia:

portslist: <%= File.read('/path/to/file.json').inspect %> 
3

Por el bien de ser completa: En caso de que esté utilizando ActiveRecord::Store, puede cargar sus datos simplemente usando la representación YAML de los mismos datos, incluso si se trata de una tienda de JSON:

one: 
    portslist: 
    - 
     name: 'ob1' 
     port_num: 0 
     port_type: 'network' 
    - 
     name: 'ob2' 
     port_num: 1 
     port_type: 'network' 
0

En mi tabla, la columna stripe_connect es de tipo JSONB. En el accesorio, aquí está lo que funcionó. Tenga en cuenta que las comillas simples exteriores son necesarias, pero los corchetes no lo son. Todo entre las comillas simples es una larga línea.

stripe_connect: '{ "alcance": "lectura_escritura", "livemode": false, "token_type": "portador", "señal_acceso": "sk_test_madeupvalue", "refresh_token": "rt_Ae29madeupvalueyX", "stripe_user_id": "acct_103yZabcdefg", "stripe_publishable_key": "pk_test_0HEOmadeupvalue"} '

Cuestiones relacionadas