使用Ruby在JSON文件中附加数据

时间:2014-04-25 12:00:40

标签: ruby json hash

我正在尝试使用ruby在JSON文件中编写/附加一些数据。我正在以适当的格式在JSON文件中写入数据时遇到问题。 我已经在temphash中创建并存储了我的值。我想在现有的JSON文件中附加temphash的内容。我是按照以下方式做的:

 tempHash = {"Group_Name" => @GroupName, "Group_Logo_Code" => @GroupLogoCode }

 json = File.read('public/group.json')
 secondJsonArray = JSON.parse(json)
 secondJsonHash = Hash[*secondJsonArray]

 jsonHash = []  
 jsonHash << secondJsonHash
 jsonHash << tempHash      

 File.open("public/group.json","w") do |f|
  f.puts JSON.pretty_generate(jsonHash)
 end 

这会创建格式错误的JSON。我没有得到预期格式的JSON

以下是我的期望:

[ 
 {
  "Group_Name": "Group Name",
  "Group_Logo_Code": "Group Logo code"
 },
 {
  "Group_Name": "Group Name",
  "Group_Logo_Code": "Group Logo code"
 },
 {
  "Group_Name": "Group Name",
  "Group_Logo_Code": "Group Logo code"
 },
]    

以下是我得到的内容:

[
  {
    "{\"{\\\"Group_Name\\\"=>\\\"Group Name\\\", \\\"Group_Logo_Code\\\"=>\\\"Group Logo code\\\"}\"=>{\"Group_Name\"=>\"Group Name\", \"Group_Logo_Code\"=>\"Group Logo code\"}}": {
  "Group_Name": "Group Name",
  "Group_Logo_Code": "Group Logo code"
    }
   },
  {
    "Group_Name": "Group Name",
    "Group_Logo_Code": "Group Logo code"
  }
]

如果有更好的方法,请告诉我。任何人都可以帮我解决这个问题。提前谢谢。

2 个答案:

答案 0 :(得分:5)

Uri Agassi's code很完美,但我想解释一下OP代码出了什么问题。

Hash[]需要一对key, value对(作为单独的参数或数组数组):

Hash[:a, 1, :b, 2]        # => {:a=>1, :b=>2}
Hash[[[:a,1], [:b,2]]]    # => {:a=>1, :b=>2}

但原始的JSON包含Hashes数组,它被解析为相应的Ruby对象,如简化案例所示:

[{:a => 1}, {:b => 2}]

在上面的数组中使用Ruby splat运算符*时:

Hash[ *[{:a => 1}, {:b => 2}] ]

您有效地为哈希构造函数提供单独的哈希作为键值对:

Hash[ {:a => 1}, {:b => 2} ]  # => {{:a=>1} => {:b=>2}}

所以,基本上,你得到了你要求的东西:你将一个哈希数组变成哈希哈希值,然后你将它添加到一个空白数组中并加上另一个哈希值。

正确的解决方案

只是为了让原始代码能够进行最少的更改(但仍然需要查看Uri's solution):

tempHash = {"Group_Name" => @GroupName, "Group_Logo_Code" => @GroupLogoCode }

json = File.read('public/group.json')
secondJsonArray = JSON.parse(json)

secondJsonArray << tempHash

File.open("public/group.json","w") do |f|
  f.puts JSON.pretty_generate(secondJsonArray)
end

答案 1 :(得分:4)

在这段代码中你似乎做得太多了 - 你为什么要尝试将数组转换为哈希?将其保留为数组:

tempHash = {"Group_Name" => @GroupName, "Group_Logo_Code" => @GroupLogoCode }

json = File.read('public/group.json')

File.open("public/group.json","w") do |f|
  f.puts JSON.pretty_generate(JSON.parse(json) << tempHash)
end