2016-10-16 4 views
7

Ich erstelle eine JSON-Datei mit Ruby. Ich muss das Objekt "Firmen" in der JSON-Datei erstellen.So erstellen Sie ein JSON-Objekt in Ruby

Erwartetes Ergebnis:

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

Was erhalte ich:

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

Mein Code:

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

Bitte lesen Sie "[mcve]". Was beinhaltet 'companies.json'? Haben Sie Ihren Code auf das Minimum reduziert, das das Problem aufzeigt? Oft wird diese Aufgabe das Problem aufdecken. –

Antwort

8

Der Kern des Problems ist, dass Sie eine Reihe von JSON erstellen Strings, anstelle eines Arrays und dann das JSON. Statt:

companies_json = [] 

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

tun:

companies = [] 

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

companies_json = companies.to_json 
+0

Hallo @Phrogz, danke, aber ich bekomme das gleiche Ergebnis mit Ihrem Schnipsel.Es gibt kein Firmenobjekt und das Array ist Ruby anstelle von json. – catch22

+1

Sie können nicht das gleiche Ergebnis erhalten; Die Art und Weise, wie @Phrogz es tut, ist das Serialisieren des Arrays von Hashes in JSON. Ihr Weg erstellt ein Array von serialisierten JSON-Hashes. Es gibt einen großen Unterschied. –

5

@Phrogz die richtige Antwort hat. Das ist ein bisschen mehr Erklärung zu liefern, was passiert:

require 'json' 

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

Das ist, was ein JSON serialisiert Hash aussieht. Es ist eine Zeichenkette, die entkalkte Anführungszeichen enthält, die den Schlüssel umschließen, wobei : das Schlüssel-Wert-Paar abgrenzt. JSON ist immer ein Array, "[...]", oder ein Hash, "{...}", und in jedem Fall ist es ein String. Das ist genau das, was Serialisierung macht und wie JSON funktioniert.

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

Das ist ein Array, das einen serialisierten JSON-Hash enthält, was Sie tun. Sie können feststellen, dass es nicht korrekt serialisiert ist, da es sich um ein Array und nicht um einen String handelt. Die umgebende [...] sind außerhalb die Zitate während in JSON sie innerhalb der Anführungszeichen sind:

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

Moving on ...

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

Das ist eine serialisierte Array von Hashes ist. In diesem Fall ist es ein einzelner Hash, aber es ist ausreichend für dieses Beispiel. Es ist ein String nach dem Serialisieren, den Sie erkennen können, weil das Array [...]innerhalb der umgebenden Anführungszeichen ist.


Wenn Sie wirklich das Zeug verstehen wollen, sehr beide empfehle ich das Lesen der JSON home page, zusammen mit Rubys JSON, YAML und Psych Dokumentation. JSON is nearly a subset of YAML, so zu wissen YAML und wie Psych implementiert es ist wirklich hilfreich, wie Sie in die Arbeit mit JSON, YAML und dem Internet bewegen.

"Fer Instanz":

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' 

bläst Kinda deinen Geist nicht?

Verwandte Themen