Problemzusammenfassung: Ich versuche, einen Hash zu JSON unter Verwendung der Oj gem zu serialisieren. Es scheint, dass Oj die Symbolschlüssel des Hash nicht automatisch in Strings konvertiert. Ich frage mich, ob Oj eine Option hat, während der Serialisierung zu "stringifizieren"? Konvertieren von Symbolen in Zeichenfolge beim Serialisieren mit Oj.dump
Dies ist ein Beispiel für meine hash:
example_hash =
{:id=>1234,
:asset_number=>"1234-5678",
:latitude=>34.78495,
:longitude=>-92.12899,
:last_tracking_record_id=>123456789,
:bearing=>42,
:threat_level=>:severe}
und die oben wie so gemacht:
render json: Oj.dump(example_hash)
Die resultierende JSON leiden Schlüssel hat, die genauso aussehen wie die oben, was bedeutete, würde ich müssen auf Elemente in JavaScript wie folgt zugreifen: response[:asset_number]
. Da der clientseitige Code vor Monaten implementiert wurde und erst jetzt Oj hinzugefügt wurde, würde ich es vorziehen, eine Möglichkeit zu finden, die Schlüssel serialisierend serverseitig zu stringifizieren.
Oj hat eine Option namens symbol_keys
, die ein boolescher Wert ist, aber es hat keine Auswirkung in dieser Hinsicht, wenn es auf true
oder gesetzt wird.
Die einzige Lösung, die ich bis jetzt gefunden habe, ist die Verwendung with_indifferent_access
wie in this answer vorgeschlagen, aber in einigen Fällen habe ich Arrays von Hashes; Während ich diese Methode technisch für jeden Hash in diesem Array aufrufen kann, würde Oj, da es die Json-Serialisierung beschleunigen soll, lieber einen Weg finden, dies mit Oj selbst zu tun. Letztendlich frage ich mich, ob es eine Option oder Einstellung in Oj gibt, die diese während Serialisierung durchführen wird.
Ich habe gerade ein Benchmarking durchgeführt, um sicherzustellen, dass der compat-Modus die Leistung nicht beeinträchtigt, und war angenehm überrascht von meinem Anwendungsfall. Ich benutzte einen Hash (string => int) mit 10.000 Schlüssel und bekam folgende Ergebnisse mit Benchmark.bmbm (kann nicht in diesen Kommentaren zu formatieren scheinen): json 14,550000 0,270000 14,820000 (14,855023) oj Standard 3,420000 0,250000 3,670000 (3,684655) oj compat 3.500000 0.260000 3.760000 (3.758900) – cmwright
@cmwright Ah sehr nett. Nach einiger Zeit war ich mir ziemlich sicher, dass es keine Performance-Probleme gab, aber ich habe nie wirklich Benchmarks gemacht. Das ist großartig zu wissen. Diese Frage scheint mehr Ansichten zu bekommen, als ich erwartet hatte, also würde es Ihnen etwas ausmachen, wenn ich Ihre Daten der Antwort hinzufügen würde (natürlich mit korrektem Kredit)? –
Ja, unbedingt. Ich kann einen Kern des Codes posten, den ich das nächste Mal benutzte, das ich an einem Computer – cmwright