2016-10-16 88 views
7

Ruby ile bir JSON dosyası oluşturuyorum. JSON dosyası içinde "şirketler" nesnesini oluşturmam gerekiyor.Ruby'de bir JSON nesnesi nasıl oluşturulur

Beklenen sonucu: Ben

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

alıyorum Ne:

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

Kodum:

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

Lütfen "[mcve]" mesajını okuyun. Companies.json' neleri içerir? Kodunuzu problemi ortaya koyan asgari kısma indirdiniz mi? Genellikle bu görev sorunu ortaya çıkaracaktır. –

cevap

8

sorunun çekirdek Eğer JSON bir dizi oluştururken olmasıdır diziler yerine diziler ve daha sonra JSON yapmak.

companies_json = [] 

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

yapın:: Yerine

companies = [] 

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

companies_json = companies.to_json 
+0

Merhaba @Phrogz, teşekkürler, ancak aynı sonucu snippet'inizle alıyorum.Şirket nesnesi yok ve dizi Ruby yerine json. – catch22

+1

Aynı sonucu elde edemezsiniz; @Phrogz'un yolu, karma dizisini JSON'a serileştiriyor. Senin yolun JSON serileştirilmiş karma bir dizi yaratıyor. Büyük bir fark var. –

5

@Phrogz doğru cevabı vardır. Bu olup bitenlerden biraz daha açıklama sağlamaktır:

JSON tefrika karma böyle görünüyor
require 'json' 

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

. Anahtar ve değer çiftini sınırlayan : anahtarını kapatan kaçan tırnak işaretleri içeren bir dizedir. JSON her zaman bir dizi, "[...]" veya bir karma, "{...}" ve her iki durumda da bir String'dir. Sadece serileştirmenin ne yaptığı ve JSON'un nasıl çalıştığı.

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

Bu, JSON serileştirilmiş bir karma içeren bir dizidir. Dizinin doğru bir şekilde serpiştirilmediğini söyleyebilirsin, çünkü bu bir Dizi değil, bir Dizidir.

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

Devam ediyoruz sağlamalarının tefrika dizisidir

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

...: JSON onlar tırnak içinde olduğunuzda ise çevredeki [...] dışında alıntılar var. Bu durumda, tek bir karma, ancak bu örnek için yeterli. Serileştirme işleminden sonra bir String, [...] dizininin çevredeki tırnak içinde içinde olduğu için anlatabileceğiniz bir dizedir.


Gerçekten ben çok Ruby'nin JSON, YAML ve Psych belgelerle birlikte, hem JSON home page okuma tavsiye bu şeyleri anlamak istiyorsanız

. JSON is nearly a subset of YAML, YAML'yi ve Psych'in bunu nasıl kullandığını bilmek, JSON, YAML ve internet ile çalışmaya başladığınızda, gerçekten'un yardımcı olduğunu düşünüyor.

"Fer örneği":

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' 

Kinda aklından değil darbeler?