【问题标题】:Pretty Print JSON generated with a jbuilder template in Rails 3.2.8在 Rails 3.2.8 中使用 jbuilder 模板生成的漂亮打印 JSON
【发布时间】:2012-10-19 04:08:01
【问题描述】:

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

我可以漂亮地打印在控制器操作中生成的 JSON,例如:

JSON.pretty_generate(some_json_object) 

但是一旦我传递给一个 jbuilder 模板,我不知道有什么方法可以打印出漂亮的输出。

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

render formats: :json    

这成功地强制使用 jbuilder 进行渲染,而不管指定的输入格式类型如何(这是我想要的行为)。

【问题讨论】:

    标签: ruby-on-rails-3 json pretty-print jbuilder


    【解决方案1】:

    我找到了一种方法:

     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()。

    这有点迂回,但它确实有效。当然,我完全愿意接受更严格的实现!

    【讨论】:

      【解决方案2】:

      我觉得这样比较简单,

      @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
      

      【讨论】:

      • 同意,这比我最初使用的解决方法干净得多。
      • 是的,可能还有其他九种方法可以完成相同的任务。
      • 很棒的家伙。我知道这条评论并没有像社区希望的那样提供任何信息。但是,我很想知道任何可以在与 Rails 相关的终端上做一些捷径魔术的链接?
      • 这似乎并没有真正回答这个问题。这漂亮地打印了一个 Ruby 哈希,它不是有效的 JSON。如果目标是从控制器操作返回漂亮打印的 JSON,那么这将无法解决问题。
      【解决方案3】:
      # 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】:

        这对我有用,而接受的答案却没有。它也更短!

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

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

        【讨论】:

          【解决方案5】:

          扩展 Blake Miller 的答案...

          这是来自gist的代码:

          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 主页提到了here 如何使用 yajl-ruby 之类的东西将加速您的 json 渲染。

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 2023-04-04
              • 2011-02-27
              • 2014-05-19
              • 2011-08-28
              • 2015-07-03
              相关资源
              最近更新 更多