Pau*_*ter 7 ruby hash serialization json ruby-on-rails
问题摘要:我试图使用Oj gem将哈希序列化为JSON .似乎Oj不会自动将哈希的符号键转换为字符串.我想知道Oj是否有序列化期间"字符串化"的选项?
这是我的哈希的一个例子:
example_hash =
{:id=>1234,
:asset_number=>"1234-5678",
:latitude=>34.78495,
:longitude=>-92.12899,
:last_tracking_record_id=>123456789,
:bearing=>42,
:threat_level=>:severe}
Run Code Online (Sandbox Code Playgroud)
以上是这样的:
render json: Oj.dump(example_hash)
Run Code Online (Sandbox Code Playgroud)
遗憾的是,生成的JSON具有与上面完全相同的键,这意味着我需要在JavaScript中访问元素,如下所示:response[:asset_number].由于客户端代码是在几个月前实现的,并且现在只添加了Oj,我宁愿在序列化服务器端找到一种方法来对字符串进行字符串化.
Oj有一个名为的选项symbol_keys,它是一个布尔值,但是在这方面将其设置为true或者false似乎没有效果.
到目前为止我找到的唯一解决方案是with_indifferent_access按照这个答案的建议使用,但是在某些情况下我有哈希数组; 虽然我可以在技术上为该数组中的每个哈希调用该方法,但是考虑到Oj旨在加速Json序列化,我宁愿找到一种方法来使用Oj本身.最后,我想知道在Oj中是否有一个选项或设置将在序列化期间执行此操作.
Pau*_*ter 11
在我写这个问题时,我找到了答案.由于我在StackOverflow上找不到与此问题相关的任何其他答案(特别是关于Oj gem),我将保留这篇文章,希望它能帮助我处理其他人.
根据之前在GitHub上讨论过的问题,将选项设置mode为:compat将确实将符号转换为字符串.所以我的渲染线现在看起来像这样:
render json: Oj.dump(example_hash, mode: :compat)
Run Code Online (Sandbox Code Playgroud)
根据Oj文档default_options,:compat模式定义如下:
...与其他系统兼容.它将序列化任何Object,但会检查Object是否实现了to_hash()或to_json()方法.如果存在,则该方法用于序列化Object.to_hash()更灵活,产生更一致的输出,因此它优先于to_json()方法.如果to_json()或to_hash()方法都不存在,则使用Oj内部Object变量编码.
因此,如果我正确地解释它,似乎这个解决方案是有效的,因为它最终使用类的to_json方法Hash.
我不确定我是否影响了性能(无论是积极的还是消极的),但至少它使我不必手动调用with_indifferent_access或to_json在数组的情况下.
更新
在性能方面,cmwright做了一些基准测试,并得出了这些结果:
Rehearsal ----------------------------------------------
json 13.990000 0.250000 14.240000 ( 14.257051)
oj default 3.260000 0.230000 3.490000 ( 3.491028)
oj compat 3.360000 0.240000 3.600000 ( 3.593109)
------------------------------------ total: 21.330000sec
user system total real
json 13.740000 0.240000 13.980000 ( 13.992641)
oj default 3.020000 0.230000 3.250000 ( 3.248077)
oj compat 3.060000 0.230000 3.290000 ( 3.286443)
Run Code Online (Sandbox Code Playgroud)
似乎该compat选项至少与默认Oj选项相同,并且明显比普通'ol更有效to_json.
这是包含基准代码的要点.
| 归档时间: |
|
| 查看次数: |
2833 次 |
| 最近记录: |