我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)
这会创建格式错误的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"
},
]
Run Code Online (Sandbox Code Playgroud)
以下是我得到的:
[
{
"{\"{\\\"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"
}
]
Run Code Online (Sandbox Code Playgroud)
如果有更好的方法,请告诉我.任何人都可以帮我解决这个问题.提前致谢.
Uri Agassi的代码很完美,但我想解释一下OP代码出了什么问题.
所述Hash[]期望的阵列key, value对(或者作为单独的参数或数组的数组):
Hash[:a, 1, :b, 2] # => {:a=>1, :b=>2}
Hash[[[:a,1], [:b,2]]] # => {:a=>1, :b=>2}
Run Code Online (Sandbox Code Playgroud)
但原始的JSON包含Hashes数组,它被解析为相应的Ruby对象,如简化情况:
[{:a => 1}, {:b => 2}]
Run Code Online (Sandbox Code Playgroud)
在*上面的数组上使用Ruby splat运算符时:
Hash[ *[{:a => 1}, {:b => 2}] ]
Run Code Online (Sandbox Code Playgroud)
您有效地为Hash构造函数提供单独的哈希值作为键值对:
Hash[ {:a => 1}, {:b => 2} ] # => {{:a=>1} => {:b=>2}}
Run Code Online (Sandbox Code Playgroud)
所以,基本上,你得到了你所要求的:你将一个哈希数组变成哈希哈希值,然后你将它添加到一个空白数组中并加上另一个哈希值.
正确的解决方案
只是为了让原始代码以最小的变化工作(但仍然看看Uri的解决方案):
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
Run Code Online (Sandbox Code Playgroud)