2

OpenStruct で json ファイルを解析しようとしています。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">
4

1 に答える 1

2

ガベージとは#<OpenStructand">のことですが、Ruby が put で呼び出されたときのオブジェクトの表現方法です。開発とデバッグに役立ち、文字列、配列、ハッシュ、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

このコードは を読み取り1.json、それを Ruby オブジェクトに変換し、スキルを追加し、ジョブ名を変更し、オブジェクトを に書き込み、2.jsonJSON として再度読み取り、すべてが正常に機能したことを確認します。

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"}]}
于 2016-11-30T17:23:05.730 に答える