我正在尝试使用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"
}
]
如果有更好的方法,请告诉我。任何人都可以帮我解决这个问题。提前谢谢。
答案 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