ruby-on-rails – 使用Oj.dump进行序列化时将符号转换为字符串

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 使用Oj.dump进行序列化时将符号转换为字符串前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
问题摘要:我正在尝试使用 Oj gem将哈希序列化为JSON.似乎Oj不会自动将哈希的符号键转换为字符串.我想知道Oj是否有序列化期间“stringify”的选项?

这是我的哈希的一个例子:

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一样访问JavaScript中的元素:response [:asset_number].由于客户端代码是在几个月前实现的,并且现在只添加了Oj,我更愿意找到一种在序列化服务器端串行化密钥的方法.

Oj有一个名为symbol_keys的选项,它是一个布尔值,但是将其设置为true或false似乎在这方面没有任何效果.

到目前为止我找到的唯一解决方案是使用this answer中建议的with_indifferent_access,但在某些情况下我有哈希数组;虽然我可以在技术上为该数组中的每个哈希调用方法,但鉴于Oj旨在加速Json序列化,我宁愿找到一种方法来使用Oj本身.最后,我想知道在Oj中是否有一个选项或设置将在序列化期间执行此操作.

解决方法

在我写这个问题时,我找到了答案.由于我在StackOverflow上找不到与此问题相关的任何其他答案(特别是关于Oj gem),我将保留这篇文章,希望它能在我的情况下帮助其他人.

根据this previously discussed issue on GitHub,将选项模式设置为:compat确实会将符号转换为字符串.所以我的渲染线现在看起来像这样:

render json: Oj.dump(example_hash,mode: :compat)

根据Oj documentation for default_options,:compat模式定义如下:

…compatible with other systems. It will serialize any Object but will
check to see if the Object implements a to_hash() or to_json() method.
If either exists that method is used for serializing the Object. The
to_hash() is more flexible and produces more consistent output so it
has a preference over the to_json() method. If neither the to_json()
or to_hash() methods exist then the Oj internal Object variable
encoding is used.

因此,如果我正确地解释它,似乎这个解决方案可行,因为它最终使用Hash类的to_json方法.

我不确定我是否影响了性能(无论是积极的还是消极的),但至少它使我不必在数组的情况下手动调用with_indifferent_access或to_json.

更新

性能方面,cmwright做了一些基准测试,并得出了这些结果:

似乎compat选项至少与默认的Oj选项相同,并且比普通的’ol to_json更有效.

这是包含基准代码gist.

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.
render json: Oj.dump(example_hash,mode: :compat)
render json: Oj.dump(example_hash,mode: :compat)0 0.230000 3.290000 ( 3.286443)

猜你在找的Ruby相关文章