2014-04-25 3 views
0

ruby를 사용하여 JSON 파일에 일부 데이터를 쓰거나 추가하려고합니다. 적절한 형식으로 JSON 파일에 데이터를 쓰는 동안 문제가 발생합니다. 나는 값을 만들어서 tempash에 저장했다. 기존 JSON 파일에 tempash의 내용을 추가하고 싶습니다. 나는 다음과 같은 방식으로하고있다 :Ruby를 사용하여 JSON 파일에 데이터 추가

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을 생성하고있다.

[ 
    { 
    "{\"{\\\"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" 
}, 
]  

내가 얻고 무엇을 : 나는

다음

내가 기대도 예상 형식으로 JSON을 받고 있지 않다 이것을하기 위해. 아무도 나를이 문제를 해결하는 데 도움 주시기 바랍니다 수 있습니다. 미리 감사드립니다.

답변

4

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 포함 된 어레이 경우 :

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

당신은 위의 배열에 루비 스 플랫 연산자 *를 사용하는 경우 :

,363,210
Hash[ *[{:a => 1}, {:b => 2}] ] 
당신은 efectively 해시 생성자에 키 - 값 쌍으로 별도의 해시를 제공

: 당신이 해시의 해시에 해시의 배열을 설정 : 그래서

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 
+0

솔루션과 멋진 설명을 증명해 주신 Laas에게 감사드립니다. Uri의 코드는 잘 작동하지만 group.json 파일 크기를 확인해야합니다. 따라서 코드를 사용하여 수행 할 수 있습니다. 따라서 응답을 승인 된 대답으로 표시하고 있습니다. 두 분 모두 다시 한 번 고마워 ... 너들 록스 ... :) – Anshul

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 
+0

고마워 열린 아가시을,이 완벽하게 잘 작동한다. 나는 Tempash를 밀어 넣기 위해 해시가 필요하다고 생각했습니다 ... 어쨌든 이것은 내가 필요한 것입니다. 유일한 것은 때때로 group.json 파일이 비어있어 파싱하기 전에 크기를 검사해야 할 때가 있습니다. 하지만 다시 한 번 많이 고마워요. :) – Anshul

관련 문제