2016-10-16 20 views
7

Tworzę plik JSON z Ruby. Potrzebuję utworzyć obiekt "firmy" w pliku JSON.Tworzenie obiektu JSON w Rubim

Oczekiwany wynik:

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

Co ja dostaję:

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

Mój kod:

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

Proszę przeczytać "[mcve]". Co zawiera słowo "firmy.json"? Czy ograniczyłeś swój kod do absolutnego minimum, które demonstruje problem? Często to zadanie ujawni problem. –

Odpowiedz

8

Istotą problemu jest to, że tworzysz tablicę JSON ciągi, zamiast tablicy, a następnie dokonanie tego JSON. Zamiast:

companies_json = [] 

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

zrobić:

companies = [] 

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

companies_json = companies.to_json 
+0

Witam @Phrogz, dziękuję, ale otrzymuję ten sam wynik z twoim urywkiem.Nie ma obiektu firmy, a tablica to Ruby zamiast json. – catch22

+1

Nie można uzyskać tego samego wyniku; Sposób, w jaki robi to @Phrogz, przekształca szereg haszy w JSON. Na swój sposób tworzysz szereg spersonalizowanych skrótów JSON. Jest duża różnica. –

5

@Phrogz ma poprawną odpowiedź. Ma to na celu zapewnienie nieco więcej wyjaśnień, co się dzieje:

require 'json' 

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

To co JSON odcinkach hash wygląda. Jest to ciąg zawierający zawężone cudzysłowy owijające klucz, z : rozgraniczeniem pary klucz i wartość. JSON jest zawsze tablicą, "[...]" lub hash, "{...}", aw każdym przypadku jest to String. Właśnie to robi serializacja i jak działa JSON.

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

To jest tablica zawierająca spersonalizowany hash JSON, co właśnie robisz. Możesz powiedzieć, że nie jest serializowany poprawnie, ponieważ jest to tablica, a nie ciąg. Otaczająca [...]poza cytaty natomiast w JSON są wewnątrz cudzysłowów:

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

Przechodząc ...

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

To odcinkach tablica skrótów. W tym przypadku jest to pojedynczy skrót, ale wystarczający dla tego przykładu. Jest to ciąg po serializowaniu, który można stwierdzić, ponieważ tablica [...] jest wewnątrz otaczających cytatów.


Jeśli naprawdę chcesz zrozumieć te rzeczy bardzo polecam czytanie zarówno JSON home page wraz z JSON, YAML i Psych dokumentacji Ruby. JSON is nearly a subset of YAML, więc znajomość YAML i sposobu, w jaki implementuje to narzędzie, jest bardzo pomocna, gdy zaczynasz pracować z JSON, YAML i internetem.

"instancja Fer":

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' 

Trochę wieje swój umysł nie?