【问题标题】:Formatting ruby hash to json将 ruby​​ 哈希格式化为 json
【发布时间】:2015-05-14 00:14:58
【问题描述】:

我目前正在将一些数据从 ruby​​ 格式化为 json; 我当前的代码如下所示

def line_chart_data
    @sources = ['Facebook','Twitter','Instagram','LinkedIn']
    @sourceCount = [5,12,16,6]
    @weeks = ['one','two','three','four','five','six']

    h = []
    @weeks.each do |i,v|
        h.push({'v' => 'Week ' + i})
        @sourceCount.each do |s|
             h.push({'v' => s})
        end
    end
    c = {c: h}


    #How the data should be formatted on export
    @sources2 = {
      cols: [
        {label: 'Week', type: 'string'},
        #Each Source needs to be looped though and formatted
        {label: 'Facebook', type: 'number'},
        {label: 'Twitter', type: 'number'},
        {label: 'Instagram', type: 'number'},
        {label: 'LinkedIn', type: 'number'}
      ],
      rows: c
     }



    respond_to do |format|
        format.js {render json: @sources2}
    end
end

当数据打印到控制台时,它看起来像这样(为简洁起见,稍微缩短了一点)

"rows":{"c":[{"v":"Week one"},{"v":5},{"v":12},{"v":16},{"v":6},
{"v":"Week two"},{"v":5},{"v":12},{"v":16},{"v":6},
{"v":"Week three"},{"v":5},{"v":12},{"v":16},{"v":6}]}

如果您注意到第一个“c”以数组开头,但在循环上述代码时,它不会每周创建一个新数组。代码应该看起来更像这样。

"rows":{"c":[{"v":"Week one"},{"v":5},{"v":12},{"v":16},{"v":6}],
{"c":[{"v":"Week two"},{"v":5},{"v":12},{"v":16},{"v":6}]},
{"c":[{"v":"Week three"},{"v":5},{"v":12},{"v":16},{"v":6}]}

每周数组的每个循环都会创建一个新的散列,其中键为“c”,值为数组。

非常感谢任何为我指明正确方向的帮助!卡在这上面好久了。

【问题讨论】:

    标签: ruby-on-rails arrays ruby json


    【解决方案1】:

    您需要重新编写代码才能获得此信息。你想要的 JSON 实际上是无效的,所以这是你能得到的最接近的:

    "rows":[{"c":[{"v":"Week one"},{"v":5},{"v":12},{"v":16},{"v":6}],
    {"c":[{"v":"Week two"},{"v":5},{"v":12},{"v":16},{"v":6}]},
    {"c":[{"v":"Week three"},{"v":5},{"v":12},{"v":16},{"v":6}]}]
    

    代码:

    rows = []
    @weeks.each do |i,v|
        h = []
        h.push({'v' => 'Week ' + i})
        @sourceCount.each do |s|
             h.push({'v' => s})
        end
        rows.push({"c" => h})
    end
    
    
    
    #How the data should be formatted on export
    @sources2 = {
      cols: [
        {label: 'Week', type: 'string'},
        #Each Source needs to be looped though and formatted
        {label: 'Facebook', type: 'number'},
        {label: 'Twitter', type: 'number'},
        {label: 'Instagram', type: 'number'},
        {label: 'LinkedIn', type: 'number'}
      ],
      rows: rows
     }
    

    【讨论】:

    • 谢谢@Martin 真的为我节省了很多时间!每次我尝试在“@weeks”中初始化 h 时,我都知道自己做错了,它会通过并出错。