2016-11-30 9 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">を意味するなら、それはプットで呼び出されたときにRubyはオブジェクトを表しだけの方法です。これは開発やデバッグに便利で、文字列、配列、ハッシュ、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 

EDIT:

あなたがjob = JSON.parse(json, object_class: OpenStruct)を使用し、あなたの仕事を変数はOpenStruct Rubyオブジェクトになります。これはjsonファイルから作成されています。

これは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

あなたのopenstructを変更した後、あなたはjsonを元に戻したいですか? –

+0

あなたがそれを明確にしたいなら、元の質問を編集することができます。あなたはそのための答えを加えてはいけません。私は自分の答えを更新しました。 –