将JSON数组与对象合并--Rails 4- Ruby

时间:2017-08-08 11:41:37

标签: ruby-on-rails json ruby

我正在使用Rails 4并从不同来源获得以下JSON输出

source1中

@something1 =   book.find().to_json

输出

"[{\"a\": \"val1\"}]"

源2

@something2 =   Author.where(title: :autitle).pluck(:val2).to_json

输出

"[{\"b\": \"val2\"}]"

来源3

@something3 = Publications.find_by_pub_id(id)

输出

{ 
  "c":"val3",
  "d":" val4"
}

我希望最终输出像

{
  "a": "val1",
  "b": "val2",
  "c":"val3",
  "d":" val4"
}

我使用了像

这样的合并
@newval= @something1[0].merge(@something2[0]).merge(@something3)

但是,它给出了错误

  

未定义的方法合并!

这些变量在索引方法中,如

class Test controller < api::controller
  def index
   @something1 = ..
   @something2 = ..
   @something3 = ..
  end
end

希望很清楚。

4 个答案:

答案 0 :(得分:2)

没有更多信息,这似乎已经足够了

@something1[0].merge(@something2[0]).merge(@something3)
{
    :a => "val1",
    :b => "val2",
    :c => "val3",
    :d => " val4"
}

答案 1 :(得分:1)

您可以创建如下函数:

def mergejson(*args)
  merged = {}
  args.each do |a|
    merged.merge!(a.is_a?(Hash) ? a : a.first)
    # or use .deep_merge! if the hashes can contain nested hashes
  end
  return merged
end

irb(main):025:0> test = mergejson(something1, something2, something3)
=> {:a=>"val1", :b=>"val2", :c=>"val3", :d=>"val4"}

答案 2 :(得分:1)

这里的问题是JSON是String因此

@something1 =   book.find().to_json
#=> "[{\"a\": \"val1\"}]"

这将使得在尝试&#34;合并时更难以处理。他们在一起。

您收到的错误是因为String没有merge方法(下次请发布完整错误或至少是对象引用),例如undefined method merge! for "[{\"a\":\"val1\"}]":String

幸运的是,修复非常简单,只需从原来的2次调用中删除to_json

require 'json'

@something1 = [{"a": "val1"}] # no to_json
@something2 = [{"b": "val2"}] # no to_json
@something3 = { "c": "val3", "d": " val4" } # no to_json

@something1[0].merge(@something2[0]).merge(@something3).to_json
#=> "{\"a\":\"val1\",\"b\":\"val2\",\"c\":\"val3\",\"d\":\" val4\"}"

请参阅Example(基于@ Gerry的原始评论示例)

如果我们理解BookAuthorPublication之间的关系,例如,我们可能会简化整个过程。

Book.find().to_json(include: [:author,:publications]) 
# Or 
Book.find().to_json(include: [{author: {only: :name}},:publications])

这将避免合并的需要,因为我担心原始示例实际上可能需要

@something1 =   book.find()
@something2 =   book.author
@something3 =   book.publications

@something1.attributes.merge({author: @something2.attributes,
    publications: @something3.map(&:attributes)}).to_json

答案 3 :(得分:0)

还有以下工作:

@something1.first.merge(@something2.first).merge(@something3)

#=>{:a => "val1",:b => "val2",:c => "val3",:d => " val4"}