如何使用Jbuilder.new创建一个json对象

时间:2016-06-02 09:53:01

标签: ruby-on-rails ruby json jbuilder

我正在使用'jbuilder'gem来创建Json。如何创建一个如下所示的Json

{ranking: {"1-3" => 2,"4-10" => 3, "11-20" => 5 }}

哈希

的描述

我的数据库中有一些关键字,每个关键字在谷歌搜索结果中都有自己的排名。上面的json键值对表示我的数据库中关键字的数量,它们的排名在1到3之间,4到10和11到20之间。

易于打包

{ranking: {"one_to_three" => 2,"four_to_ten" => 3, "eleven_to_twenty" => 5 }}

使用以下代码。

Jbuilder.new do |ranking|
   ranking.one_to_three 2
   ranking.four_to_ten 3
   ranking.eleven_to_twenty 5
end

但我需要将其转换为

{ranking: {"1-3" => 2,"4-10" => 3, "11-20" => 5 }}

我需要为上面的代码做些什么改变才能实现这个目标

请帮帮我

1 个答案:

答案 0 :(得分:0)

您的代码存在的问题是

  

{ranking:{“1-3”=> 2,“4-10”=> 3,“11-20”=> 5}}

不是有效的JSON使用this to验证您JSON

这似乎更像是使用主密钥的符号排名和对于第二级密钥的字符串“1-3”的红宝石哈希的定义

在这里,您可以了解如何构建有效的JSON:

http://json.org/

转换简单的JSON哈希很容易使用to_json ant然后转换字符串使用gsub for all和sub为第一个匹配的实例

这可能是您的结构的有效JSON

{
    "ranking": {
        "1-3": 2,
        "4-10": 3,
        "11-20": 5
    }
}

所以让我们从

获取最后一个JSON
irb(main):001:0> require 'json'
=> true
irb(main):002:0> my_hash = {ranking: {"1-3" => 2,"4-10" => 3, "11-20" => 5 }}
=> {:ranking=>{"1-3"=>2, "4-10"=>3, "11-20"=>5}}
irb(main):003:0> string_json = my_hash.to_json
=> "{\"ranking\":{\"1-3\":2,\"4-10\":3,\"11-20\":5}}"
irb(main):005:0> string_json.gsub(":"," => ").sub(" => ", " : ")
=> "{\"ranking\" : {\"1-3\" => 2,\"4-10\" => 3,\"11-20\" => 5}}"

最后得到你想要的东西,玩排名词“

irb(main):037:0> puts string_json.gsub(":"," => ").sub(" => ", ": ").sub("\"ranking\"","ranking")
{ranking: {"1-3" => 2,"4-10" => 3,"11-20" => 5}}
=> nil