Как создать объект JSON в Ruby

Я создаю файл JSON с Ruby. Мне нужно создать объект "компании" в файле JSON.

ожидаемый результат:

{"companies":[
    {"label":"Wayfair ","values":[54]},
    {"label":"Move24 ","values":[29]},
    {"label":"Auto1 ","values":[23]},
...
]}

что я получаю:

[  
   "{"label":"Wayfair ","values":[54,54]}",
   "{"label":"Move24 ","values":[29,29]}",
   "{"label":"GetYourGuide ","values":[28,28]}",
   "{"label":"Auto1.com ","values":[20,20]}", ...
]

мой код:

data_hash = data_hash.map {|k,v| {label: k, values: v}}

companies_json = []

data_hash.each do |hash|
  companies_json << hash.to_json
end

File.open('companies.json', 'w') do |f|
  f << companies_json
end

2 ответов


суть вашей проблемы заключается в том, что вы создаете массив строк JSON вместо массива, а затем делаете этот JSON. Вместо:

companies_json = []

data_hash.each do |hash|
  companies_json << hash.to_json
end

do:

companies = []

data_hash.each do |hash|
  companies << hash
end

companies_json = companies.to_json

@Phrogz имеет правильный ответ. Это должно дать немного больше объяснений того, что происходит:

require 'json'

foo = {'a' => 1}
foo.to_json # => "{\"a\":1}"

вот как выглядит сериализованный хэш JSON. Это строка, содержащая экранированные кавычки, обертывающие ключ, с : разграничение пары ключ и значение. JSON всегда является массивом,"[...]", или хэш, "{...}" и в любом случае это строка. Это то, что делает сериализация и как работает JSON.

[foo.to_json] # => ["{\"a\":1}"]
[foo.to_json].class # => Array

это массив, содержащий JSON сериализованный хэш, что ты и делаешь. Вы можете сказать, что он не сериализован правильно, потому что это массив, а не строка. Окружающие [...] are за пределами кавычки, тогда как в JSON они находятся внутри кавычек:

[].to_json # => "[]"
{}.to_json # => "{}"

идем дальше...

[foo].to_json # => "[{\"a\":1}]"
[foo].to_json.class # => String

это сериализованный массив хэшей. В этом случае это один хэш, но этого достаточно для данного примера. Это строка после сериализации, которую вы можете сказать, потому что array [...] is внутри в кавычки.


если вы действительно хотите понять этот материал, я настоятельно рекомендую прочитать как Домашняя страница JSON, вместе с Руби JSON, в YAML и Psych документация. JSON почти подмножество YAML, так что, зная ЯМЛ и то, как психика реализует его действительно полезно по мере того как вы двигаете в работу с JSON, YAML и интернет.

"Фер экземпляр":

json_hash = '{"a":1}'
yaml_hash = "---\na: 1"

require 'yaml'
YAML.load(json_hash) # => {"a"=>1}
YAML.load(yaml_hash) # => {"a"=>1}

Psych.load(json_hash) # => {"a"=>1}
Psych.load(yaml_hash) # => {"a"=>1}

require 'json'
JSON[json_hash] # => {"a"=>1}
JSON[yaml_hash] # => JSON::ParserError: 743: unexpected token at '---\na: 1'

слегка дует ваш разум, не так ли?