任何人都有办法从 jbuilder 漂亮地打印 JSON 输出?
我可以漂亮地打印在控制器操作中生成的 JSON,例如:
JSON.pretty_generate(some_json_object)
但是一旦我传递给一个 jbuilder 模板,我不知道有一种方法可以很好地打印输出。
现在,我的操作方法的渲染语句很简单:
render formats: :json
这成功地强制使用 jbuilder 进行渲染,而不管指定的输入格式类型如何(这是我想要的行为)。
任何人都有办法从 jbuilder 漂亮地打印 JSON 输出?
我可以漂亮地打印在控制器操作中生成的 JSON,例如:
JSON.pretty_generate(some_json_object)
但是一旦我传递给一个 jbuilder 模板,我不知道有一种方法可以很好地打印输出。
现在,我的操作方法的渲染语句很简单:
render formats: :json
这成功地强制使用 jbuilder 进行渲染,而不管指定的输入格式类型如何(这是我想要的行为)。
我找到了一种方法来做到这一点:
json_string = render_to_string formats: :json
json_object = JSON.parse(json_string)
render :json => JSON.pretty_generate(json_object)
同样,这假定此操作有一个 jbuilder 模板,它将创建初始 json,该 json 被呈现为字符串,返回为 json 对象,然后传递给 pretty_generate()。
这有点迂回,但它确实有效。当然,我完全愿意接受更严格的实现!
# config/initializers/jbuilder_prettify.rb
require "jbuilder"
class Jbuilder
##
# Allows you to set @prettify manually in your .jbuilder files.
# Example:
# json.prettify true
# json.prettify false
#
attr_accessor :prettify
alias_method :_original_target, :target!
##
# A shortcut to enabling prettify.
# Example:
# json.prettify!
#
def prettify!
@prettify = true
end
def target!
@prettify ? ::JSON.pretty_generate(@attributes) : _original_target
end
end
# app/views/api/v1/users/show.json.jbuilder
json.prettify! if %w(1 yes true).include?(params["pretty"])
json.( @user, :id, :name, :created_at, :updated_at )
https://github.com/rails/jbuilder/issues/195#issuecomment-44440569
扩展布莱克米勒的答案......
这是来自要点的代码:
require 'multi_json'
MultiJson.use :yajl
unless Rails.env.production?
MultiJson.dump_options = {:pretty=>true}
end
我把它放到一个名为 /config/initializers/jbuilder_prettify.rb 的文件中
为了使它工作,您必须将 yajl-ruby gem 包含在您的 Gemfile 中。请注意,jbuilder github 主页在这里提到了如何使用 yajl-ruby 之类的东西来加快 json 渲染速度。
这对我有用,而接受的答案却没有。它也更短!
https://gist.github.com/jmoe/02c7476adac24eddd969
require 'multi_json'
MultiJson.use :yajl
unless Rails.env.production?
MultiJson.dump_options = {:pretty=>true}
end
config/initializers/jbuilder.rb
和:
class Jbuilder
def target!
::JSON.pretty_generate(@attributes)
end
end
结果,https://localhost:3000/manifest.json
{
"name": "Socializus",
"short_name": "Socializus",
"start_url": "http://localhost:3000",
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone",
"icons": [
{
"src": "/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}
我觉得这个比较简单
@package = Package.first
json = JSON.parse(@blog.to_json)
PP.pp(json)
{"id_to_s"=>"5222675dbc11149e3a000002",
"title"=>"Package Title",
"version"=>"0.1.1",
"comment"=>
{"user"=>"Joe",
"description"=>"Joe's comment"},
"assets"=>
[{"id_to_s"=>"522a4620fa451436f4000001",
"_type"=>"Illustration",
"start"=>0,
"stop"=>100,
"caption"=>"mountain climbing"},
{"id_to_s"=>"522a56a6fa4514523a000001",
"_type"=>"Illustration",
"start"=>200,
"stop"=>300,
"caption"=>"airport"},
{"id_to_s"=>"522a6a0ffa4514a30e000002",
"_type"=>"Illustration",
"start"=>400,
"stop"=>600,
"caption"=>"doc"},
{"id_to_s"=>"522aa46bbc1114551f000001",
"_type"=>"Illustration",
"start"=>nil,
"stop"=>nil,
"caption"=>nil},
{"id_to_s"=>"522aa47fbc1114551f000002",
"_type"=>"Illustration",
"start"=>10,
"stop"=>30,
"caption"=>"asdflkjsd"}]}
或者,更快的单线,
PP.pp JSON.parse Blog.first.to_json