当前位置:  开发笔记 > 后端 > 正文

如何在Ruby on Rails中"漂亮"格式化我的JSON输出?

如何解决《如何在RubyonRails中"漂亮"格式化我的JSON输出?》经验,为你挑选了10个好方法。

我希望Ruby on Rails中的JSON输出"漂亮"或格式良好.

现在,我打电话to_json,我的JSON全部在一条线上.有时,如果JSON输出流中存在问题,则很难看到.

有没有办法配置或方法使我的JSON在Rails中"漂亮"或格式良好?



1> jpatokal..:

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


最初的海报在Rails应用程序中没有提到_where_他想要使用它,所以我回答了一系列随处可用的Ruby.要使用它在Rails*controller*中生成JSON响应,您已经回答了自己的问题:`format.json {render:json => JSON.pretty_generate(my_json)}`.
漂亮!我把它放到我的〜/ .irbrc中:def json_pp(json)把JSON.pretty_generate(JSON.parse(json))结束
为了使它在Rails中有用,似乎你应该给出一个答案,其中包括可以在与`format.json {render:json => @whatever}相同的上下文中使用的代码.
当然,prettyprinting只应用于服务器端调试?如果您将上面的代码粘贴在控制器中,那么在所有响应中都会有大量无用的空白,这对于客户端调试来说甚至都不需要,因为任何值得他们使用的工具(例如Firebug)已经处理了漂亮的JSON.
@jpatokal:你可能会认为还有其他更好的选择,但问题是如何让它在Rails中运行.说"你不想在Rails中这样做"是一个不答案.显然很多人都想在Rails中做到这一点.
@jpatokal上面对`render`的评论对我不起作用.我不得不稍微修改一下:`render:json => JSON.pretty_generate(JSON.parse(my_json))`

2> gertas..:

感谢Rack Middleware和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

上面的代码应该放在app/middleware/pretty_json_response.rb你的Rails项目中.最后一步是将中间件注册到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测试)


在Rails 4中也很棒......谢谢!我更喜欢使用更多特定于库的方法(如在接受的答案中).因为你只应该在开发模式下使用它,性能命中并不是什么大问题.
在Rails 5中,我不得不将`Rack :: Utils.bytesize(pretty_str).to_s`更改为`pretty_str.bytesize.to_s`并且效果很好!
您如何绕过to_json的ActiveSupport的[redefinition](https://github.com/rails/rails/blob/3-0-stable/activesupport/lib/active_support/core_ext/object/to_json.rb)?存在ActiveSupport时,这使我无法进行漂亮的打印。

3> Roger Garza..:

与HTML一起使用的标记JSON.pretty_generate将在您的视图中呈现JSON.当我的杰出老板告诉我这件事时,我很高兴:

<% if @data.present? %>
   
<%= JSON.pretty_generate(@data) %>
<% end %>


如此简洁明了!

4> 小智..:

如果你想:

    自动从您的应用程序中清除所有传出的JSON响应.

    避免污染Object#to_json/#as_json

    避免使用中间件解析/重新呈现JSON(YUCK!)

    以RAILS方式做吧!

然后......替换JSON的ActionController :: Renderer!只需将以下代码添加到ApplicationController:

ActionController::Renderers.add :json do |json, options|
  unless json.kind_of?(String)
    json = json.as_json(options) if json.respond_to?(:as_json)
    json = JSON.pretty_generate(json, options)
  end

  if options[:callback].present?
    self.content_type ||= Mime::JS
    "#{options[:callback]}(#{json})"
  else
    self.content_type ||= Mime::JSON
    json
  end
end



5> Synthead..:

看看awesome_print.将JSON字符串解析为Ruby Hash,然后使用awesome_print显示它,如下所示:

require "awesome_print"
require "json"

json = '{"holy": ["nested", "json"], "batman!": {"a": 1, "b": 2}}'

ap(JSON.parse(json))

有了上述内容,您将看到:

{
  "holy" => [
    [0] "nested",
    [1] "json"
  ],
  "batman!" => {
    "a" => 1,
    "b" => 2
  }
}

awesome_print还会添加一些Stack Overflow不会显示的颜色:)


同意您!awesome_print很简​​单!
我们也在我们的项目中使用awesome_print,它的工作方式就像名称-> awesome

6> Thomas Klemm..:

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

pp User.first.as_json

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


要从pp获取字符串而不是打印到标准输出,请使用User.first.as_json.pretty_inspect。对我来说效果很好。

7> Phrogz..:

如果你(像我一样)发现pretty_generateRuby的JSON库中内置的选项不够"漂亮",我推荐自己的ppgem用于格式化.

要使用它pretty_generate然后使用pp而不是pretty_generate.

像Ruby一样,pp它会在适合的时候将对象和数组放在一行上,但根据需要包装到多个.例如:

gem install neatjson

它还支持各种格式化选项,以进一步自定义输出.例如,冒号之前/之后有多少个空格?逗号之前/之后?在数组和对象的括号内?你想对对象的键进行排序吗?你想要将所有冒号排成一列吗?


这种宝石-结肠上的排列特别甜蜜!
我也喜欢格式化!一个非常酷的选择。

8> oj5th..:

使用

HTML代码,pretty_generate是一个很好的技巧:

<%
  require 'json'

  hash = JSON[{hey: "test", num: [{one: 1, two: 2, threes: [{three: 3, tthree: 33}]}]}.to_json] 
%>

  <%=  JSON.pretty_generate(hash) %>



9> Wayne Conrad..:

这是一个由@gertas的优秀答案修改的中间件解决方案.此解决方案不是Rails特定的 - 它应该适用于任何Rack应用程序.

这里使用的中间件技术,使用#each,由Eifion Bedford的ASCIIcasts 151:Rack Middleware解释.

此代码位于app/middleware/pretty_json_response.rb中:

class PrettyJsonResponse

  def initialize(app)
    @app = app
  end

  def call(env)
    @status, @headers, @response = @app.call(env)
    [@status, @headers, self]
  end

  def each(&block)
    @response.each do |body|
      if @headers["Content-Type"] =~ /^application\/json/
        body = pretty_print(body)
      end
      block.call(body)
    end
  end

  private

  def pretty_print(json)
    obj = JSON.parse(json)  
    JSON.pretty_unparse(obj)
  end

end

要打开它,请将其添加到config/environments/test.rb和config/environments/development.rb:

config.middleware.use "PrettyJsonResponse"

正如@gertas在他的解决方案版本中警告的那样,避免在生产中使用它.这有点慢.

用Rails 4.1.6测试.



10> 小智..:
#At Controller
def branch
    @data = Model.all
    render json: JSON.pretty_generate(@data.as_json)
end

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有