2016-11-30 62 views
2

我想解析與OpenStruct的json文件。 Json文件有一個技能數組。當我解析它時,我會返回一些額外的「垃圾」。我如何擺脫它?Ruby解析與OpenStruct json數組

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

如果垃圾,你的意思是#<OpenStruct">,它只是在與看跌期權稱爲紅寶石代表對象的方式。它對於開發和調試非常有用,並且使它更易於理解String,Array,Hash和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),你的工作變量變成一個OpenStruct Ruby對象,它是從json文件創建的。

它和json沒有任何關係:它不再是json對象,所以你不能把它寫回.json文件,並期望它具有正確的語法。

OpenStruct似乎不適合to_json,所以刪除object_class: OpenStruct可能更好,只需使用散列和數組。

此代碼讀取1.json,將其轉換爲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後,修改你的openstruct? –

+0

好的。如果你想澄清它,你可以(也應該)編輯你的原始問題。你不應該爲此添加答案。我更新了我的答案。 –