我希望Ruby on Rails中的JSON输出是“漂亮的”或格式正确的。
现在,我叫to_json
,而我的JSON都在一行上。有时很难发现JSON输出流中是否有问题。
是否可以通过配置使我的JSON“漂亮”或在Rails中很好地格式化?
使用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"
}
感谢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的测试)
与<pre>
一起使用的HTML中的JSON.pretty_generate
标记将在您的视图中呈现JSON。当我杰出的老板向我展示这个时,我感到非常高兴:
如果您想:
签出Awesome Print。将JSON字符串解析为Ruby哈希,然后使用ap
进行显示,如下所示:
将ActiveRecord对象转储为JSON(在Rails控制台中:)>]
pp User.first.as_json
# => {
"id" => 1,
"first_name" => "Polar",
"last_name" => "Bear"
}
使用<pre>
HTML代码和pretty_generate
是一个好技巧:
[如果您发现Ruby的JSON库中内置的pretty_generate
选项不够“漂亮”,我建议您使用自己的NeatJSON gem作为格式。
这里是从this excellent answer by @gertas修改而来的中间件解决方案。此解决方案不是特定于Rails的,它应可与任何Rack应用程序一起使用。
#At Controller
def branch
@data = Model.all
render json: JSON.pretty_generate(@data.as_json)
end
这是我在自己的搜索过程中从其他帖子中获得的解决方案。
我已经使用了宝石CodeRay,它工作得很好。格式包括颜色,并且可以识别很多不同的格式。
如果您想在Rails控制器操作中快速实现此功能以发送JSON响应:
# 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
我使用以下内容,因为我发现标头,状态和JSON输出对于一套。呼叫例程是根据来自[c0]
精美打印版本:
最简单的例子,我能想到: