Dans un fichier au format JSON, on ne met pas tout ce qu’on veut… Notamment en ce qui concerne les caractères de fin de ligne et les tabulations.

En effet, ceux-ci ne sont pas autorisés à l’intérieur des chaines de caractères. Voici un exemple.

Tout d’abord, pas de caractères spéciaux:

{
  "item" : "article"
}
$ rvm use 2.1.0
Using /home/xavier/.rvm/gems/ruby-2.1.0
$ irb
>> require 'json'
=> file = IO.read File.expand_path('./doc.json')
>> JSON.parse file
=> {"item"=>"Article"}

Tout va bien.

Maintenant avec des caractères de fin de lignes échappés:

{
  "item" : "article\ndescription\nprice"
}
=> file = IO.read File.expand_path('./doc.json')
=> "{\n  \"item\" : \"article\\ndescription\\nprice\"\n}\n"
>> JSON.parse file
=> {"item"=>"article\ndescription\nprice"}

C’est toujours bon.

Par contre, avec des fins de lignes «en dur» dans le fichier:

{
  "item" : "Article
    description
    price"
}
>> file = IO.read File.expand_path('./doc.json')
=> "{\n  \"item\" : \"Article\n    description\n    price\"\n}\n"
>> JSON.parse file
JSON::ParserError: 757: unexpected token at '{
  "item" : "Article
    description
    price"
}
'

Rien ne va plus. C’est pareil avec les tabulations.

Si vous récupérez ce genre de fichier, vous pouvez les nettoyer en remplaçant par exemple les tabulations et les fins de ligne par un espace:

file.gsub(/[\t\n]/, ' ')

À demain.