[RUBY-ON-RAILS] 어떻게 루비 온 레일즈 "꽤"형식의 JSON 출력으로
RUBY-ON-RAILS어떻게 루비 온 레일즈 "꽤"형식의 JSON 출력으로
나는 "매우"또는 잘 포맷으로 레일에 루비 내 JSON 출력을하고 싶습니다.
지금, 나는 to_json 전화 내 JSON은 한 줄에 모든 것입니다. 때때로 이것은 JSON 출력 스트림에 문제가 있는지 확인하기 어려울 수 있습니다.
"꽤"또는 정중하게 레일 포맷 내 JSON을 할 구성하려면이 방법이 있습니까?
해결법
-
==============================
1.JSON의 이후 버전에 내장 된 pretty_generate () 함수를 사용합니다. 예를 들면 :
JSON의 이후 버전에 내장 된 pretty_generate () 함수를 사용합니다. 예를 들면 :
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" }
-
==============================
2.덕분에 앱의 컨트롤러를 변경하지 않고 미들웨어 및 레일 당신이 모든 요청에 대한 출력 꽤 JSON 할 수있는 3 랙합니다. 나는 그런 미들웨어 스 니펫 (snippet)을 작성하고 난 잘 브라우저와 컬 출력에 JSON을 인쇄 얻을.
덕분에 앱의 컨트롤러를 변경하지 않고 미들웨어 및 레일 당신이 모든 요청에 대한 출력 꽤 JSON 할 수있는 3 랙합니다. 나는 그런 미들웨어 스 니펫 (snippet)을 작성하고 난 잘 브라우저와 컬 출력에 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
위의 코드는 응용 프로그램 / 미들웨어 / pretty_json_response.rb 레일즈 프로젝트에 배치해야합니다. 그리고 마지막 단계는 미들웨어의 설정 / 환경 / development.rb 등록하는 것입니다 :
config.middleware.use PrettyJsonResponse
나는 production.rb에서 사용하지 않는 것이 좋습니다. json으로 파싱 응답 시간 및 생산 응용 프로그램의 처리량이 저하 될 수 있습니다. 등 결국 추가 로직 'X-예쁜-JSON : 사실'헤더가 필요에 따라 수동 컬 요청 서식 트리거에 도입 될 수있다.
(레일 3.2.8-5.0.0, 루비 1.9.3-2.2.0과 테스트, 리눅스)
-
==============================
3.JSON.pretty_generate 사용 HTML의 <전> 태그는보기에 꽤 JSON 렌더링됩니다. 내 저명한 상사가 나에게 이것을 보여 주었다 때 난 너무 행복했다 :
JSON.pretty_generate 사용 HTML의 <전> 태그는보기에 꽤 JSON 렌더링됩니다. 내 저명한 상사가 나에게 이것을 보여 주었다 때 난 너무 행복했다 :
<% if @data.present? %> <pre><%= JSON.pretty_generate(@data) %></pre> <% end %>
-
==============================
4.당신이 원하는 경우 :
당신이 원하는 경우 :
그리고 ... ActionController을 대체 :: 렌더러를 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
-
==============================
5.최고 인쇄를 확인하십시오. 다음, 루비 해시로 JSON 문자열을 구문 분석과 같이 AP로 표시 :
최고 인쇄를 확인하십시오. 다음, 루비 해시로 JSON 문자열을 구문 분석과 같이 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 } }
최고 출력은 스택 오버플로는 표시되지 않습니다 몇 가지 색상을 추가합니다.
-
==============================
6.(레일 콘솔) JSON에 액티브 오브젝트를 덤프 :
(레일 콘솔) JSON에 액티브 오브젝트를 덤프 :
pp User.first.as_json # => { "id" => 1, "first_name" => "Polar", "last_name" => "Bear" }
-
==============================
7.<전> HTML 코드와 pretty_generate를 사용하는 것은 좋은 트릭입니다 :
<전> 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>
-
==============================
8.루비의 JSON 라이브러리에 내장 된 pretty_generate 옵션이 "꽤"충분하지 않은 것을 발견하면, 당신이 서식에 대한 내 자신의 NeatJSON 보석을 권장합니다.
루비의 JSON 라이브러리에 내장 된 pretty_generate 옵션이 "꽤"충분하지 않은 것을 발견하면, 당신이 서식에 대한 내 자신의 NeatJSON 보석을 권장합니다.
이 기능을 사용하려면 :
gem install neatjson
다음 사용
JSON.neat_generate
대신에
JSON.pretty_generate
그들이 맞는 때 루비의 쪽처럼 한 줄에 객체와 배열을 유지하지만, 필요에 따라 여러 바꿈. 예를 들면 :
{ "navigation.createroute.poi":[ {"text":"Lay in a course to the Hilton","params":{"poi":"Hilton"}}, {"text":"Take me to the airport","params":{"poi":"airport"}}, {"text":"Let's go to IHOP","params":{"poi":"IHOP"}}, {"text":"Show me how to get to The Med","params":{"poi":"The Med"}}, {"text":"Create a route to Arby's","params":{"poi":"Arby's"}}, { "text":"Go to the Hilton by the Airport", "params":{"poi":"Hilton","location":"Airport"} }, { "text":"Take me to the Fry's in Fresno", "params":{"poi":"Fry's","location":"Fresno"} } ], "navigation.eta":[ {"text":"When will we get there?"}, {"text":"When will I arrive?"}, {"text":"What time will I get to the destination?"}, {"text":"What time will I reach the destination?"}, {"text":"What time will it be when I arrive?"} ] }
또한 추가하여 출력을 사용자 정의 서식 옵션의 다양한 지원합니다. 예를 들어, 얼마나 많은 공간 이전 / 콜론 후? 전 / 쉼표 후? 배열과 객체의 괄호 안에? 당신이 당신의 개체의 키를 정렬 하시겠습니까? 당신이 모든 콜론을 줄 수 하시겠습니까?
-
==============================
9.여기 @gertas하여이 우수한 답변에서 수정 미들웨어 솔루션이다. 이 솔루션은 아닙니다 특정 레일 - 그것은 어떤 랙 응용 프로그램과 함께 작동합니다.
여기 @gertas하여이 우수한 답변에서 수정 미들웨어 솔루션이다. 이 솔루션은 아닙니다 특정 레일 - 그것은 어떤 랙 응용 프로그램과 함께 작동합니다.
#each를 사용하여, 여기에 사용 된 기술이 미들웨어, ASCIIcasts 151 설명 : Eifion 베드포드, 미들웨어 랙.
이 코드는 응용 프로그램 / 미들웨어 / 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
전원을 켜려면을 설정 / 환경 / test.rb 및 설정 / 환경 / development.rb이 추가 :
config.middleware.use "PrettyJsonResponse"
@gertas이 솔루션의 자신의 버전에 경고로서, 생산을 사용하지 마십시오. 그것은 다소 느리다.
레일 4.1.6로 테스트.
-
==============================
10.
#At Controller def branch @data = Model.all render json: JSON.pretty_generate(@data.as_json) end
-
==============================
11.여기에 내가 내 자신의 검색 중에 다른 게시물에서 파생 된 내 솔루션입니다.
여기에 내가 내 자신의 검색 중에 다른 게시물에서 파생 된 내 솔루션입니다.
이것은 필요에 따라 파일에 PP와 JJ 출력을 보낼 수 있습니다.
require "pp" require "json" class File def pp(*objs) objs.each {|obj| PP.pp(obj, self) } objs.size <= 1 ? objs.first : objs end def jj(*objs) objs.each {|obj| obj = JSON.parse(obj.to_json) self.puts JSON.pretty_generate(obj) } objs.size <= 1 ? objs.first : objs end end test_object = { :name => { first: "Christopher", last: "Mullins" }, :grades => [ "English" => "B+", "Algebra" => "A+" ] } test_json_object = JSON.parse(test_object.to_json) File.open("log/object_dump.txt", "w") do |file| file.pp(test_object) end File.open("log/json_dump.txt", "w") do |file| file.jj(test_json_object) end
-
==============================
12.나는 보석 CodeRay을 사용하고 꽤 잘 작동합니다. 형식은 색상이 포함되어 있으며 다른 형식을 많이 인식하고 있습니다.
나는 보석 CodeRay을 사용하고 꽤 잘 작동합니다. 형식은 색상이 포함되어 있으며 다른 형식을 많이 인식하고 있습니다.
나는 레일 API를 디버깅하는 데 사용할 수있는 보석에 그것을 사용하고 꽤 잘 작동합니다.
그런데, 보석의 이름은 'api_explorer'(http://www.github.com/toptierlabs/api_explorer)
-
==============================
13.당신이 찾고 있다면 신속하게 JSON 응답을 보낼 수있는 레일 컨트롤러 액션이 구현 :
당신이 찾고 있다면 신속하게 JSON 응답을 보낼 수있는 레일 컨트롤러 액션이 구현 :
def index my_json = '{ "key": "value" }' render json: JSON.pretty_generate( JSON.parse my_json ) end
-
==============================
14.당신이 RABL를 사용하는 경우 JSON.pretty_generate를 사용하여 여기에 설명 된대로 구성 할 수 있습니다 :
당신이 RABL를 사용하는 경우 JSON.pretty_generate를 사용하여 여기에 설명 된대로 구성 할 수 있습니다 :
class PrettyJson def self.dump(object) JSON.pretty_generate(object, {:indent => " "}) end end Rabl.configure do |config| ... config.json_engine = PrettyJson if Rails.env.development? ... end
JSON.pretty_generate를 사용의 문제점은 JSON 스키마 유효성 검사기가 더 이상 날짜 문자열에 만족하실 것입니다. 당신은 귀하의 설정 / 초기화 / rabl_config.rb에서 그 문제를 해결할 수 있습니다 :
ActiveSupport::TimeWithZone.class_eval do alias_method :orig_to_s, :to_s def to_s(format = :default) format == :default ? iso8601 : orig_to_s(format) end end
-
==============================
15.
# example of use: a_hash = {user_info: {type: "query_service", e_mail: "my@email.com", phone: "+79876543322"}, cars_makers: ["bmw", "mitsubishi"], car_models: [bmw: {model: "1er", year_mfc: 2006}, mitsubishi: {model: "pajero", year_mfc: 1997}]} pretty_html = a_hash.pretty_html # include this module to your libs: module MyPrettyPrint def pretty_html indent = 0 result = "" if self.class == Hash self.each do |key, value| result += "#{key}
-
==============================
16.나뿐만 헤더, 상태 및 JSON 출력이 유용으로 나는 다음을 사용 세트. http://railscasts.com/episodes/151-rack-middleware?autoplay=true : 호출 루틴이에서 추천을 세분화되어에서 프리젠 테이션을 railscasts
나뿐만 헤더, 상태 및 JSON 출력이 유용으로 나는 다음을 사용 세트. http://railscasts.com/episodes/151-rack-middleware?autoplay=true : 호출 루틴이에서 추천을 세분화되어에서 프리젠 테이션을 railscasts
class LogJson def initialize(app) @app = app end def call(env) dup._call(env) end def _call(env) @status, @headers, @response = @app.call(env) [@status, @headers, self] end def each(&block) if @headers["Content-Type"] =~ /^application\/json/ obj = JSON.parse(@response.body) pretty_str = JSON.pretty_unparse(obj) @headers["Content-Length"] = Rack::Utils.bytesize(pretty_str).to_s Rails.logger.info ("HTTP Headers: #{ @headers } ") Rails.logger.info ("HTTP Status: #{ @status } ") Rails.logger.info ("JSON Response: #{ pretty_str} ") end @response.each(&block) end end
-
==============================
17.예쁜 프린트의 변형 :
예쁜 프린트의 변형 :
my_object = { :array => [1, 2, 3, { :sample => "hash"}, 44455, 677778, 9900 ], :foo => "bar", rrr: {"pid": 63, "state": false}} puts my_object.as_json.pretty_inspect.gsub('=>', ': ')
결과:
{"array": [1, 2, 3, {"sample": "hash"}, 44455, 677778, 9900], "foo": "bar", "rrr": {"pid": 63, "state": false}}
-
==============================
18.예를 들어 간단한, 내가 생각할 수 :
예를 들어 간단한, 내가 생각할 수 :
my_json = '{ "name":"John", "age":30, "car":null }' puts JSON.pretty_generate(JSON.parse(my_json))
콘솔 예 레일 :
core dev 1555:0> my_json = '{ "name":"John", "age":30, "car":null }' => "{ \"name\":\"John\", \"age\":30, \"car\":null }" core dev 1556:0> puts JSON.pretty_generate(JSON.parse(my_json)) { "name": "John", "age": 30, "car": null } => nil
from https://stackoverflow.com/questions/86653/how-to-pretty-format-json-output-in-ruby-on-rails by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 레일 : 데이터베이스에 저장 번역 (0) | 2020.03.02 |
---|---|
[RUBY-ON-RAILS] 고안와 함께 추가 등록 필드 추가 (0) | 2020.03.02 |
[RUBY-ON-RAILS] 작동하지 않는 4.0 expire_fragment / 캐시 만료 레일 (0) | 2020.03.02 |
[RUBY-ON-RAILS] 레일에서 어떻게 핸들 배수 단지에 분할 체크 박스를 체크, 또는? (0) | 2020.03.02 |
[RUBY-ON-RAILS] "BCrypt :: 오류 :: InvalidHash"로그인 시도 (0) | 2020.03.02 |