2016-11-30 12 views
2

Ich versuche, eine JSON-Datei mit OpenStruct zu analysieren. Die JSON-Datei enthält ein Array für Skills. Wenn ich es analysiere, bekomme ich etwas zusätzlichen "Müll" zurück. Wie werde ich es loswerden?Ruby Parsing JSON-Array mit OpenStruct

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

Was meinst du, Müll? –

Antwort

1

Wenn von Müll, meinen Sie #<OpenStruct und "> ist es genau so, wie Ruby-Objekte darstellt, wenn sie mit Puts genannt. Es ist nützlich für die Entwicklung und das Debugging, und es macht es einfacher, den Unterschied zwischen einem String, einem Array, einem Hash und einem OpenStruct zu verstehen.

Wenn Sie nur den Namen und die Cluster-Namen angezeigt werden, und nichts anderes:

puts job.Job 
job.Skills.each do |skill| 
    puts skill.Name 
    puts skill.ClusterName 
end 

Es gibt:

My Job 1 
Name 1 
Cluster Name 1 Skills 
Name 2 
Cluster Name 2 Skills 

EDIT:

Wenn Sie job = JSON.parse(json, object_class: OpenStruct), Ihren Job Variable wird zu einem OpenStruct Ruby-Objekt, das aus einer JSON-Datei erstellt wurde.

Es hat jedoch nichts mit json zu tun: Es ist kein Json-Objekt mehr, Sie können es also nicht einfach in eine .json-Datei schreiben und erwarten, dass es die korrekte Syntax hat.

OpenStruct scheint nicht gut mit to_json zu funktionieren, so dass es besser sein könnte, object_class: OpenStruct zu entfernen, und einfach mit Hashes und Arrays arbeiten.

Dieser Code liest 1.json, wandelt es in ein Ruby-Objekt, fügt eine Fertigkeit, ändert den Namen des Auftrags, schreibt das Objekt 2.json und liest es wieder als JSON zu überprüfen, ob alles hat gut funktioniert.

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

Ja, ich meinte die # runski74

+0

Okay, also willst du einen JSON zurück, nachdem du deine Openstruktur geändert hast? –

+0

Okay. Sie können (und sollten) Ihre ursprüngliche Frage bearbeiten, wenn Sie sie klären möchten. Sie sollten keine Antwort dafür hinzufügen. Ich habe meine Antwort aktualisiert. –