用sinatra替换json数组中的值

时间:2011-03-23 01:19:32

标签: ruby json sinatra

我有一个'资源'字段的记录,可以包含多个资源。当我返回此数据时,我需要迭代此字段并返回字段中每个值的单个记录。我目前正在使用sinatra并且能够在字段上进行交互,但是我在更换json数组中的字段时遇到了困难。

例如 事件:姓名 资源:resourceA,resourceB,resourceC

此记录需要作为3个uniqe记录/事件返回,每个记录只有一个资源。

使用下面列出的代码,我得到三条记录,但所有三条记录都返回相同的资源值(resourceC)

这是我的代码

docs = @db.view('lab/events', :startkey => params[:startDate], :endkey => endSearch)['rows']
rows = Array.new
docs.each do |doc|
  resources = doc['value']['resources'].split(",")
  resources.each do |r|
    doc['value']['resources'] = r
    rows.push(doc['value'])
  end
end

非常感谢任何帮助。 谢谢 克里斯

2 个答案:

答案 0 :(得分:1)

如果你使用ruby gem“json”,你可以将json字符串转换为哈希

require 'json'
converted_hash = JSON(json_string).to_hash

这应该更容易管理。

然后,您可以将哈希值转换为JSON字符串:

new_json_string = converted_hash.to_json

答案 1 :(得分:0)

基本上正在发生的事情是ruby将所有三个记录视为同一记录,因此哈希值在一条记录上更新,它会影响从同一个文档创建的所有其他记录。为了解决这个问题,我每次都需要创建一个重复记录并修改它的值。

  docs = @db.view('lab/events', :startkey => params[:startDate], :endkey => endSearch)['rows']
  rows = Array.new
  docs.each do |doc|
    resources = doc['value']['resources'].split(",")
    resources.each do |r|
      newDoc = doc['value'].dup # <= create a duplicate record and update the value
      newDoc["resources"] = r
      rows.push(newDoc)
    end
  end