2016-10-16 2 views
7

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

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

{"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

Пожалуйста, прочтите «[mcve]». Что содержит 'company.json'? Вы сократили свой код до минимума, который демонстрирует проблему? Часто эта задача покажет проблему. –

ответ

8

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

companies_json = [] 

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

сделать:

companies = [] 

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

companies_json = companies.to_json 
+0

привет @Phrogz, спасибо, но я получаю тот же результат с вашим фрагментом.Нет объекта компании, а массив - Ruby вместо json. – catch22

+1

Вы не можете получить тот же результат; Путь @Phrogz делает сериализацию массива хэшей в JSON. Ваш путь создает массив сериализованных хешей JSON. Есть большая разница. –

5

@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, который вы делаете. Вы можете сказать, что оно не сериализовано правильно, потому что это массив, а не строка. Окружающий [...] является вне кавычки, тогда как в JSON они внутри кавычек:

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

Переходит ...

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

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


Если вы действительно хотите понять этот материал, я настоятельно рекомендую прочитать как JSON home page, наряду с JSON, YAML и Psych документации Руби. JSON is nearly a subset of YAML, поэтому знание YAML и того, как Psych реализует, это действительно полезно при работе с 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' 

Любопытное взрывает ваш разум не так ли?