[ruby-on-rails] Ruby on Rails에서 JSON 출력을“예쁜”형식으로 만드는 방법

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 및 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.rbRails 프로젝트에 배치해야합니다 . 마지막 단계는 미들웨어를 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을보기에 아름답게 렌더링합니다. 저의 유명한 상사가 나에게 이것을 보여 주었을 때 너무 기뻤습니다.

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


답변

원하는 경우 :

  1. 앱에서 나가는 모든 JSON 응답을 자동으로 확인합니다.
  2. Object # to_json / # as_json을 오염시키지 마십시오
  3. 미들웨어 (YUCK!)를 사용하여 JSON 구문 분석 / 다시 렌더링하지 마십시오
  4. 그것을 레일 방식으로하십시오!

그런 다음 … ActionController :: Renderer for JSON! 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


답변

멋진 인쇄를 확인하십시오 . JSON 문자열을 Ruby Hash로 구문 분석 한 후 다음과 ap같이 표시하십시오 .

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에 표시되지 않는 색상을 추가합니다.


답변

Rails 콘솔에서 ActiveRecord 객체를 JSON으로 덤프 :

pp User.first.as_json

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


답변

<pre>HTML 코드를 사용 하고 pretty_generate좋은 트릭입니다.

<%
  require 'json'

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

<pre>
  <%=  JSON.pretty_generate(hash) %>
</pre>