2016-05-06 7 views
0

Oft finde ich mich in der Situation, wo ich beginne, eine neue API zu erforschen und große JSON-Objekte zurück zu bekommen. Und jedes Mal habe ich Mühe, einen Weg zu finden, sie richtig einzuordnen, damit ich die Struktur leicht sehen und die Teile identifizieren kann, die für meine Aufgabe relevant sind.Wie wird mit großen JSON-Daten beim Erkunden einer API umgegangen?

Im Moment erkunde ich die Z-Wave API für Razberry (Home Automation). Ich bekomme ein JSON zurück, das alle Geräte enthält, die an das Home Automation-Netzwerk angeschlossen sind. Es sieht wie folgt aus:

enter image description here

Und ich verstehe nicht, warum Rails die Zeilen in der Art und Weise bricht kann es hier zu sehen ist, und warum es nicht gelingt, richtig die JSON-Daten einrücken. Die Ausgabe auf dem Screenshot ist das Ergebnis dieses Controller-Code:

request = Net::HTTP::Get.new(uri) 
request.basic_auth 'admin', 'bla' 

response = Net::HTTP.start(uri.hostname, uri.port) do |http| 
    http.request(request) 
end 

@devices = JSON.parse(response.body) 
render json: @devices 

Es wäre interessant zu sehen, wie erfahrene Programmierer JSON in diesem Stadium behandeln, wenn die Datenstruktur zu erkunden. Wie kann ich die JSON in diesem Stil zeigen ?:

 

{"1": 
    {"instances": 
     {"0":{ 
      "commandClasses": 
       {"32": 
        {"name":"Basic", 
        "data": 
         {"invalidateTime":1462455293, 
         "updateTime":1462365990, 
         "type":"empty", 
         "value":null, 
         "supported": 
          {"invalidateTime":1462455293, 
          "updateTime":1462365990, 
          "type":"bool", 
          "value":true}, 
         "version": 

 

Antwort

1

Sie JSON.pretty_generate() Methode verwenden können:

Beispiel:

require 'json' 
my_json = { :array => [1, 2, 3, { :sample => "hash"} ], :foo => "bar" } 
puts JSON.pretty_generate(my_json) 

Ausgang:

{ 
    "array": [ 
    1, 
    2, 
    3, 
    { 
     "sample": "hash" 
    } 
    ], 
    "foo": "bar" 
} 

Ihr Code:

request = Net::HTTP::Get.new(uri) 
request.basic_auth 'admin', 'bla' 

response = Net::HTTP.start(uri.hostname, uri.port) do |http| 
    http.request(request) 
end 

@devices = JSON.parse(response.body) 
render json: JSON.pretty_generate(@devices) 
+0

wunderbar, danke! – Flip

1

Angenommen, Sie sind bereit, die Frage zu erweitern "Was kann ich tun, um die Ausgabe meines Antwortkörpers so menschenfreundlich wie möglich zu gestalten?", Möchte ich Ihnen auch Awesome Print empfehlen. Das Erzwingen von "awesome_print" -Ergebnissen in der Instanzmethode ai (für awesome inspect) wird zu Kernel hinzugefügt. Es kann an all verschiedene Argumente oder keine nehmen, wie zum Beispiel in der irb Sitzung unter eingefügt:

2.3.0 :030 > require 'awesome_print' 
=> false 
2.3.0 :031 > response_body.ai(html: true) 
=> "<pre>{\n &quot;array&quot;<kbd style=\"color:slategray\"> =&gt; </kbd>[\n  <kbd style=\"color:white\">[0] </kbd><kbd style=\"color:blue\">1</kbd>,\n  <kbd style=\"color:white\">[1] </kbd><kbd style=\"color:blue\">2</kbd>,\n  <kbd style=\"color:white\">[2] </kbd><kbd style=\"color:blue\">3</kbd>,\n  <kbd style=\"color:white\">[3] </kbd>{\n   &quot;sample&quot;<kbd style=\"color:slategray\"> =&gt; </kbd><kbd style=\"color:brown\">&quot;hash&quot;</kbd>\n  }\n ],\n  &quot;foo&quot;<kbd style=\"color:slategray\"> =&gt; </kbd><kbd style=\"color:brown\">&quot;bar&quot;</kbd>\n}</pre>" 
2.3.0 :032 > puts response_body.ai 
{ 
    "array" => [ 
     [0] 1, 
     [1] 2, 
     [2] 3, 
     [3] { 
      "sample" => "hash" 
     } 
    ], 
     "foo" => "bar" 
} 
=> nil 

Es ist so einfach in Ruby zu unterstützen JSON, YAML und fantastischen Druck, dass ich all drei in meinem Code anbieten .

Verwandte Themen