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.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로 테스트)
답변
<pre>
와 함께 사용되는 HTML 의 태그 JSON.pretty_generate
는 JSON을보기에 아름답게 렌더링합니다. 저의 유명한 상사가 나에게 이것을 보여 주었을 때 너무 기뻤습니다.
<% if @data.present? %>
<pre><%= JSON.pretty_generate(@data) %></pre>
<% end %>
답변
원하는 경우 :
- 앱에서 나가는 모든 JSON 응답을 자동으로 확인합니다.
- Object # to_json / # as_json을 오염시키지 마십시오
- 미들웨어 (YUCK!)를 사용하여 JSON 구문 분석 / 다시 렌더링하지 마십시오
- 그것을 레일 방식으로하십시오!
그런 다음 … 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>
