Часто я оказываюсь в ситуации, когда начинаю изучать новый API и возвращаю большие объекты JSON. И каждый раз я изо всех сил пытаюсь найти способ отобразить их с правильным отступом, чтобы я мог легко увидеть структуру и определить части, относящиеся к моей задаче.
Прямо сейчас я изучаю Z-Wave API для Razberry (Home Automation). Я возвращаю JSON, содержащий все устройства, подключенные к сети Home Automation. Выглядит это так:
И я не понимаю, почему 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":
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)
Предполагая, что вы хотите расширить вопрос до «Что я могу сделать, чтобы вывод моего тела ответа был максимально удобным для человека?», Я также хотел бы предложить использовать 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 "array"<kbd style=\"color:slategray\"> => </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 "sample"<kbd style=\"color:slategray\"> => </kbd><kbd style=\"color:brown\">"hash"</kbd>\n }\n ],\n "foo"<kbd style=\"color:slategray\"> => </kbd><kbd style=\"color:brown\">"bar"</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, что я предлагаю все три в своем коде.
Похожие вопросы
Новые вопросы
ruby-on-rails
Ruby on Rails - это полнофункциональная платформа веб-приложений с открытым исходным кодом, написанная на Ruby. Он следует популярной модели фреймворка MVC и известен своим подходом «соглашение поверх конфигурации» при разработке приложений.