如何在Ruby on Rails中“漂亮”格式化JSON输出?

不羁的心 提交于 2020-01-06 15:26:37

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

我希望Ruby on Rails中的JSON输出是“漂亮的”或格式正确的。

现在,我调用to_json而我的JSON都在一行上。 有时很难发现JSON输出流中是否存在问题。

有没有方法可以配置我的JSON或在Rails中很好地格式化JSON?


#1楼

借助Rack Middleware和Rails 3,您可以为每个请求输出漂亮的JSON,而无需更改应用程序的任何控制器。 我已经编写了这样的中间件代码片段,并且在浏览器和curl输出中得到了很好的打印JSON。

class PrettyJsonResponse
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, response = @app.call(env)
    if headers["Content-Type"] =~ /^application\/json/
      obj = JSON.parse(response.body)
      pretty_str = JSON.pretty_unparse(obj)
      response = [pretty_str]
      headers["Content-Length"] = pretty_str.bytesize.to_s
    end
    [status, headers, response]
  end
end

上面的代码应该放在Rails项目的app/middleware/pretty_json_response.rb中。 最后一步是在config/environments/development.rb注册中间件:

config.middleware.use PrettyJsonResponse

我不建议在production.rb使用它 。 JSON重新解析可能会降低响应时间和生产应用程序的吞吐量。 最终可能会引入额外的逻辑,例如“ X-Pretty-Json:true”标头,以触发按需手动卷曲请求的格式化。

(经过Rails 3.2.8-5.0.0,Ruby 1.9.3-2.2.0,Linux的测试)


#2楼

这是我在自己的搜索过程中从其他帖子中获得的解决方案。

这使您可以根据需要将pp和jj输出发送到文件。

require "pp"
require "json"

class File
  def pp(*objs)
    objs.each {|obj|
      PP.pp(obj, self)
    }
    objs.size <= 1 ? objs.first : objs
  end
  def jj(*objs)
    objs.each {|obj|
      obj = JSON.parse(obj.to_json)
      self.puts JSON.pretty_generate(obj)
    }
    objs.size <= 1 ? objs.first : objs
  end
end

test_object = { :name => { first: "Christopher", last: "Mullins" }, :grades => [ "English" => "B+", "Algebra" => "A+" ] }

test_json_object = JSON.parse(test_object.to_json)

File.open("log/object_dump.txt", "w") do |file|
  file.pp(test_object)
end

File.open("log/json_dump.txt", "w") do |file|
  file.jj(test_json_object)
end

#3楼

JSON.pretty_generate使用的HTML中的<pre>标记将在您的视图中呈现JSON。 当我杰出的老板向我展示这一点时,我感到非常高兴:

<% if @data.present? %>
   <pre><%= JSON.pretty_generate(@data) %></pre>
<% end %>

#4楼

使用内置在更高版本的JSON中的pretty_generate()函数。 例如:

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

这使您:

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

#5楼

我使用了宝石CodeRay,效果很好。 格式包括颜色,并且可以识别许多不同的格式。

我已经在可用于调试Rails API的gem上使用了它,并且效果很好。

顺便说一下,该宝石被命名为'api_explorer'( http://www.github.com/toptierlabs/api_explorer

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!