问题摘要:我试图使用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
,this answer中的建议,但是在某些情况下,我有散列数组;虽然我可以在技术上为该数组中的每个散列调用该方法,但鉴于Oj旨在加快Json序列化的速度,我宁愿找到一种方法来使用Oj本身执行此操作。最终,我想知道Oj中是否有一个选项或设置将在系列化期间执行此。
我只是做了一些基准测试,以确保compat模式不会影响性能,并惊喜于我的用例。我使用了一个带有10,000个键的散列(string => int),并使用Benchmark.bmbm获得了以下结果(似乎无法在这些注释中进行格式化):json 14.550000 0.270000 14.820000(14.855023) oj default 3.420000 0.250000 3.670000(3.684655) oj compat 3.500000 0.260000 3.760000(3.758900) – cmwright
@cmwright啊非常好。过了一会儿,我确定没有任何性能问题,但我从来没有做过任何实际的基准测试。很高兴知道。这个问题似乎获得了比我预期更多的观点,那么如果我将数据添加到答案中(当然有适当的功劳),那么你会介意吗? –
是的,绝对是它的。我可以张贴我下次在电脑上使用的代码的要点 – cmwright