Часто я оказываюсь в ситуации, когда начинаю изучать новый API и возвращаю большие объекты JSON. И каждый раз я изо всех сил пытаюсь найти способ отобразить их с правильным отступом, чтобы я мог легко увидеть структуру и определить части, относящиеся к моей задаче.

Прямо сейчас я изучаю Z-Wave API для Razberry (Home Automation). Я возвращаю JSON, содержащий все устройства, подключенные к сети Home Automation. Выглядит это так:

enter image description here

И я не понимаю, почему Rails разбивает строки так, как это видно здесь, и почему ему не удается правильно сделать отступ для данных JSON. Вывод на скриншоте является результатом этого кода контроллера:

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

Было бы интересно посмотреть, как более опытные программисты обрабатывают JSON на этом этапе, исследуя структуру данных. Как я могу отобразить JSON в этом стиле ?:


{"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":


0
Flip 6 Май 2016 в 16:35

2 ответа

Лучший ответ

Вы можете использовать {{X0} } метод:

Примере:

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

Выход:

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

Ваш код:

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)
1
Зелёный 6 Май 2016 в 13:46

Предполагая, что вы хотите расширить вопрос до «Что я могу сделать, чтобы вывод моего тела ответа был максимально удобным для человека?», Я также хотел бы предложить использовать Awesome Print. Требование 'awesome_print' приводит к добавлению метода экземпляра ai (для awesome inspect ) в Kernel. Он может принимать различные аргументы или вообще не иметь, например, в сеансе irb, вставленном ниже:

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

В Ruby так легко поддерживать JSON, YAML и Awesome Print, что я предлагаю все три в своем коде.

1
Keith Bennett 6 Май 2016 в 15:16