Как создать объект 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'
слегка дует ваш разум, не так ли?