問題の概要:Oj gemを使用してJSONにハッシュをシリアル化しようとしています。 Ojは自動的にハッシュのシンボルキーを文字列に変換しないようです。シリアル化中にOjが "文字列化"するオプションを持っているのだろうかと思いますか?Oj.dumpでシリアル化するときにシンボルを文字列に変換する
これは私のハッシュの例である:
example_hash =
{:id=>1234,
:asset_number=>"1234-5678",
:latitude=>34.78495,
:longitude=>-92.12899,
:last_tracking_record_id=>123456789,
:bearing=>42,
:threat_level=>:severe}
そしてそうのように上記レンダリングされます。
render json: Oj.dump(example_hash)
結果のJSONが、残念ながら、私は希望を意味し、まさに上記のように見えるキーを持っています次のようにJavaScriptの要素にアクセスする必要があります:response[:asset_number]
。クライアント側のコードは数ヶ月前に実装され、Ojが追加されたばかりなので、シリアライズ時にサーバー側でキーをストリング化する方法を見つけることをお勧めします。
Ojにはsymbol_keys
という名前のオプションがありますが、これはブール値ですが、true
またはfalse
のいずれかに設定すると、この点で影響がないようです。
私が今までに見つけた唯一の解決策は、で提案されているようにwith_indifferent_access
を使用することですが、いくつかのケースではハッシュの配列があります。 OjはJsonの直列化を高速化することを前提にしているので、Oj自体でこれを行う方法を見つけたいと考えているので、その配列の各ハッシュに対してそのメソッドを技術的に呼び出すことができます。最終的には、のシリアル化中にを実行するOjにオプションまたは設定があるのだろうかと思います。
互換モードがパフォーマンスに影響を与えないことを確認するためにベンチマークを行いました。私のユースケースには驚いていました。私は10,000のキーでハッシュ(文字列=> int)を使用し、Benchmark.bmbmで次の結果を得ました(これらのコメントではフォーマットできないようです):json 14.550000 0.270000 14.820000(14.855023) ojデフォルト3.420000 0.250000 3.670000(3.684655) oj compat 3.500000 0.260000 3.760000(3.758900) – cmwright
@cmwrightああ素敵です。しばらくしてもパフォーマンス上の問題はないことが確かめられましたが、実際のベンチマークを行うことは決してありませんでした。それは素晴らしいことです。この質問は私が期待していたより多くの意見を得ているようですので、私はあなたのデータを答えに追加すればいいですか? –
ええ、それは絶対に行きます。私は次回にコンピュータで使用したコードの要点を投稿することができます – cmwright