2016-11-23 1 views
2

Ich versuche, eine JSON-Datei, die Objekt und Array enthalten, in eine JSON-Datei zu konvertieren.JSON in hashmap in Ruby umwandeln

Unten ist die JSON-Datei

{ 
    "localbusiness":{ 
     "name": "toto", 
     "phone": "+11234567890" 
    }, 
    "date":"05/02/2016", 
    "time":"5:00pm",  
    "count":"4", 
    "userInfo":{ 
     "name": "John Doe", 
     "phone": "+10987654321", 
     "email":"[email protected]", 
     "userId":"user1234333" 
    } 
} 

mein Ziel ist es, zu speichern diese eine Datenbank wie MongoId ist. Ich möchte Karte verwenden, so etwas wie zu bekommen:

localbusiness_name => "toto", 
localbusiness_phone => "+11234567890", 
date => "05/02/2016", 
... 
userInfo_name => "John Doe" 
... 

I Karte habe versucht, aber es ist nicht die Reihe von lokalen Unternehmen Aufspalten oder userinfo

def format_entry 
    ps = @params.map do | h | 
    ps.merge!(h) 
    @@logger.info("entry #{h}") 
    end 
    @@logger.info("formatting the data #{ps}") 
    ps 
end 

Ich weiß nicht wirklich, wie jeder Eintrag zu analysieren und Erstelle den Namen

+0

Ist '@ params' der JSON-Hash oder die Rails-Variable? Ist es möglich, die Ausgabe von 'format_entry' anzuzeigen? –

+0

@ElijahSchutz Formateintrag funktioniert nicht, merge fail. Parameter ist der JSON-Hash – Seb

+0

Haben Sie die JSON-Datei als Text, und Sie möchten es in einen verschachtelten Hash konvertieren? Wenn ja, "fordere 'json"; myhash = JSON.parse (text); 'wird das tun. –

Antwort

3

Es sieht aus wie Sie versuchen, die inneren Hashes in einen großen Hash "abzuflachen". Flatten ist falsch, weil Sie den Hash-Schlüssel dem Schlüssel des Sub-Hashs voranstellen möchten. Dies erfordert das Durchlaufen des Hash und dann das erneute Durchlaufen jedes Unter-Hashs. Dieses Codebeispiel funktioniert nur, wenn Sie eine Ebene tief haben. Wenn Sie mehrere Ebenen haben, würde ich vorschlagen, zwei Methoden oder eine rekursive Methode zu machen.

@business = { # This is a hash, not a json blob, but you can take json and call JSON.parse(blob) to turn it into a hash. 
    "localbusiness":{ 
     "name": "toto", 
     "phone": "+11234567890" 
    }, 
    "date":"05/02/2016", 
    "time":"5:00pm", 
    "count":"4", 
    "userInfo":{ 
     "name": "John Doe", 
     "phone": "+10987654321", 
     "email":"[email protected]", 
     "userId":"user1234333" 
    } 
} 

@squashed_business = Hash.new 

@business.each do |k, v| 
    if v.is_a? Hash 
    v.each do |key, value| 
     @squashed_business.merge! (k.to_s + "_" + key.to_s) => value 
    end 
    else 
    @squashed_business.merge! k => v 
    end 
end 

ich bemerkt, dass Sie „unerwartete“ Ergebnisse bekommen, wenn ein Hash-Aufzählen über @params.each { |h| ... }, weil es Ihnen sowohl einen Schlüssel und einen Wert. Stattdessen möchten Sie @params.each { |key, value| ... } wie im obigen Codebeispiel tun.

+0

Nein. Meine Antwort würde Ihre nicht verbessern. Sobald ich es gesehen habe, habe ich es hochgestuft und wollte es löschen, als ich deinen Kommentar gesehen habe. –

+0

Danke. Wir versuchen alle nur zu helfen! Ich denke du hast etwas Cooles/Ähnliches in deiner Antwort mit 'class' gemacht? – Dbz

+0

Ich fand Ihren Weg effizienter, direkter. Und der wichtige Teil ist das OP hat eine Lösung. Du hast es richtig gemacht. Wir sind alle hier um zu helfen. –