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

问题描述 投票:626回答:18

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

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

是否可以通过配置使我的JSON“漂亮”或在Rails中很好地格式化?

ruby-on-rails ruby json pretty-print
18个回答
996
投票

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

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"
}

78
投票

感谢Rack Middleware and 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的测试)


76
投票

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


23
投票

如果您想:


17
投票

签出Awesome Print。将JSON字符串解析为Ruby哈希,然后使用ap进行显示,如下所示:


13
投票

将ActiveRecord对象转储为JSON(在Rails控制台中:)>]

pp User.first.as_json

# => {
 "id" => 1,
 "first_name" => "Polar",
 "last_name" => "Bear"
}

12
投票

使用<pre> HTML代码和pretty_generate是一个好技巧:


12
投票

[如果您发现Ruby的JSON库中内置的pretty_generate选项不够“漂亮”,我建议您使用自己的NeatJSON gem作为格式。


8
投票

这里是从this excellent answer by @gertas修改而来的中间件解决方案。此解决方案不是特定于Rails的,它应可与任何Rack应用程序一起使用。


5
投票
#At Controller
def branch
    @data = Model.all
    render json: JSON.pretty_generate(@data.as_json)
end

4
投票

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


3
投票

我已经使用了宝石CodeRay,它工作得很好。格式包括颜色,并且可以识别很多不同的格式。


3
投票

如果您想在Rails控制器操作中快速实现此功能以发送JSON响应:


2
投票

如果使用RABL,则可以按照here所述配置它以使用JSON.pretty_generate:


2
投票

# example of use:
a_hash = {user_info: {type: "query_service", e_mail: "[email protected]", phone: "+79876543322"}, cars_makers: ["bmw", "mitsubishi"], car_models: [bmw: {model: "1er", year_mfc: 2006}, mitsubishi: {model: "pajero", year_mfc: 1997}]}
pretty_html = a_hash.pretty_html

# include this module to your libs:
module MyPrettyPrint
    def pretty_html indent = 0
        result = ""
        if self.class == Hash
            self.each do |key, value|
                result += "#{key}: #{[Array, Hash].include?(value.class) ? value.pretty_html(indent+1) : value}"
            end
        elsif self.class == Array
            result = "[#{self.join(', ')}]"
        end
        "#{result}"
    end

end

class Hash
    include MyPrettyPrint
end

class Array
    include MyPrettyPrint
end

1
投票

我使用以下内容,因为我发现标头,状态和JSON输出对于一套。呼叫例程是根据来自[c0]


1
投票

精美打印版本:


0
投票

最简单的例子,我能想到:

© www.soinside.com 2019 - 2024. All rights reserved.