Ruby 使用 OpenStruct 解析 json 数组
Ruby Parsing json array with OpenStruct
我正在尝试使用 OpenStruct 解析 json 文件。 Json 文件有一个技能数组。当我解析它时,我得到了一些额外的 "garbage" 返回。我该如何摆脱它?
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">
如果说垃圾,你的意思是 #<OpenStruct
和 ">
,这就是 Ruby 在用 puts 调用时表示对象的方式。它对开发和调试很有用,并且更容易理解 String、Array、Hash 和 OpenStruct 之间的区别。
如果你只想显示名称和集群名称,没有别的:
puts job.Job
job.Skills.each do |skill|
puts skill.Name
puts skill.ClusterName
end
它returns :
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"}]}
我正在尝试使用 OpenStruct 解析 json 文件。 Json 文件有一个技能数组。当我解析它时,我得到了一些额外的 "garbage" 返回。我该如何摆脱它?
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">
如果说垃圾,你的意思是 #<OpenStruct
和 ">
,这就是 Ruby 在用 puts 调用时表示对象的方式。它对开发和调试很有用,并且更容易理解 String、Array、Hash 和 OpenStruct 之间的区别。
如果你只想显示名称和集群名称,没有别的:
puts job.Job
job.Skills.each do |skill|
puts skill.Name
puts skill.ClusterName
end
它returns :
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"}]}