2016-11-30 3 views
2

OpenStruct로 json 파일을 구문 분석하려고합니다. Json 파일에는 기술에 대한 배열이 있습니다. 내가 파싱 할 때 여분의 "쓰레기"가 반환됩니다. 어떻게 제거합니까? 쓰레기에 의한 경우Ruby OpenStruct로 json 배열 구문 분석

{ 
     "Job": "My Job 1", 

     "Skills": [{ "Name": "Name 1", "ClusterName": "Cluster Name 1 Skills"},{ "Name": "Name 2", "ClusterName": "Cluster Name 2 Skills"}] 
} 

require 'ostruct' 
require 'json' 


json = File.read('1.json') 
job = JSON.parse(json, object_class: OpenStruct) 

puts job.Skills 


#<OpenStruct Name="Name 1", ClusterName="Cluster Name 1 Skills"> 
#<OpenStruct Name="Name 2", ClusterName="Cluster Name 2 Skills"> 
+0

무엇을 의미합니까, 쓰레기? –

답변

1

JSON, 당신은 #<OpenStruct">을 의미, 그것은 풋 호출 할 때 루비 객체를 나타냅니다 다만 방법이다. 개발 및 디버깅에 유용하며 문자열, 배열, 해시 및 OpenStruct 간의 차이점을보다 쉽게 ​​이해할 수 있습니다.

당신은 단지 이름과 클러스터 이름, 아무것도 표시하려면 :

puts job.Job 
job.Skills.each do |skill| 
    puts skill.Name 
    puts skill.ClusterName 
end 

그것은 반환

My Job 1 
Name 1 
Cluster Name 1 Skills 
Name 2 
Cluster Name 2 Skills 

편집 :

당신이 job = JSON.parse(json, object_class: OpenStruct)를 사용

, 작업을 변수는 json 파일에서 생성 된 OpenStruct Ruby 객체가됩니다.

json과는 아무런 관련이 없습니다. 더 이상 json 객체가 아니므로 .json 파일에 다시 쓰고 올바른 구문이 있어야합니다.

OpenStruct가 to_json과 잘 작동하지 않는 것 같습니다. 따라서 object_class: OpenStruct을 제거하고 해시와 배열을 사용하는 것이 좋습니다.

이 코드는 Ruby 객체로 변환하고, 기술을 추가하고, 작업 이름을 수정하고, 2.json에 객체를 쓰고, JSON으로 다시 읽어 모든 것이 잘 작동하는지 확인합니다.

require 'json' 

json = File.read('1.json') 
job = JSON.parse(json) 

job["Skills"] << {"Name" => "Name 3", "ClusterName" => "Cluster Name 3 Skills"} 
job["Job"] += " (modified version)" 

# job[:Fa] = 'blah' 

File.open('2.json', 'w'){|out| 
    out.puts job.to_json 
} 

require 'pp' 
pp JSON.parse(File.read('2.json')) 

# {"Job"=>"My Job 1 (modified version)", 
# "Skills"=> 
# [{"Name"=>"Name 1", "ClusterName"=>"Cluster Name 1 Skills"}, 
# {"Name"=>"Name 2", "ClusterName"=>"Cluster Name 2 Skills"}, 
# {"Name"=>"Name 3", "ClusterName"=>"Cluster Name 3 Skills"}]} 
+0

예, # runski74

+0

좋아요, 그럼 개새공을 수정 한 후에 json을 원하니? –

+0

오케이. 원래 질문을 명확하게하려는 경우 편집 할 수 있습니다. 당신은 그것에 대한 대답을 추가해서는 안됩니다. 나는 나의 대답을 업데이트했다. –