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 在用 puts 调用时表示对象的方式。它对于开发和调试很有用,它可以更容易地理解字符串、数组、哈希和 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"}]}
于 2016-11-30T17:23:05.730 回答