在Rails 3.2.8中使用jbuilder模板生成的JSON如何进行漂亮的打印?

6

有没有办法从jbuilder中漂亮地打印JSON输出?

在控制器操作中生成的JSON可以使用以下方式进行漂亮的打印:

JSON.pretty_generate(some_json_object) 

但是一旦我转到jbuilder模板,我不知道有什么方法可以使输出的内容格式化。

现在,我的操作方法的渲染语句很简单:

render formats: :json    

这可以成功地强制使用jbuilder进行渲染,而不考虑指定的输入格式类型(这是我期望的行为)。

6个回答

6
我找到了一种方法来做到这点:
 json_string = render_to_string formats: :json    
 json_object = JSON.parse(json_string)     
 render :json => JSON.pretty_generate(json_object)     

再次强调,这里假设对于此操作有一个jbuilder模板,它将创建初始的json对象,然后将其呈现为字符串,再将其转换回json对象并传递给pretty_generate()。

这有点绕,但是它能工作。当然,我完全可以接受更简洁的实现方法!


6
# 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


4

在Blake Miller的回答基础上进行扩展...

下面是来自Gist的代码:

require 'multi_json'
MultiJson.use :yajl
unless Rails.env.production?
  MultiJson.dump_options = {:pretty=>true}
end

我将其放入名为/config/initializers/jbuilder_prettify.rb的文件中。
为了使其工作,您必须在Gemfile中包含yajl-ruby gem。请注意,jbuilder github首页提到这里如何使用yajl-ruby之类的东西可以加速您的json渲染。

1

这个方法对我来说很有效,而被接受的答案却没有。它也更简短!

https://gist.github.com/jmoe/02c7476adac24eddd969

require 'multi_json'
MultiJson.use :yajl
unless Rails.env.production?
  MultiJson.dump_options = {:pretty=>true}
end

1

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

-1

我认为这更简单。

@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

同意,这比我最初使用的解决方法要干净得多。 - idStar
1
是的,可能还有其他九种方法来完成同样的任务。 - westonplatter
厉害啊,伙计。我知道这个评论并没有像社区希望的那样提供任何有用的信息。不过,我很想知道有没有任何链接可以让我在终端上进行与Rails相关的快捷操作? - RajG
1
这似乎并没有真正回答问题。这只是漂亮地打印了一个 Ruby Hash,而不是有效的 JSON。如果目标是从控制器操作返回漂亮打印的 JSON,则这种方法行不通。 - Dathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接