복붙노트

[RUBY-ON-RAILS] 어떻게 루비 온 레일즈 "꽤"형식의 JSON 출력으로

RUBY-ON-RAILS

어떻게 루비 온 레일즈 "꽤"형식의 JSON 출력으로

나는 "매우"또는 잘 포맷으로 레일에 루비 내 JSON 출력을하고 싶습니다.

지금, 나는 to_json 전화 내 JSON은 한 줄에 모든 것입니다. 때때로 이것은 JSON 출력 스트림에 문제가 있는지 확인하기 어려울 수 있습니다.

"꽤"또는 정중하게 레일 포맷 내 JSON을 할 구성하려면이 방법이 있습니까?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    3.JSON.pretty_generate 사용 HTML의 <전> 태그는보기에 꽤 JSON 렌더링됩니다. 내 저명한 상사가 나에게 이것을 보여 주었다 때 난 너무 행복했다 :

    JSON.pretty_generate 사용 HTML의 <전> 태그는보기에 꽤 JSON 렌더링됩니다. 내 저명한 상사가 나에게 이것을 보여 주었다 때 난 너무 행복했다 :

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

    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. ==============================

    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. ==============================

    6.(레일 콘솔) JSON에 액티브 오브젝트를 덤프 :

    (레일 콘솔) JSON에 액티브 오브젝트를 덤프 :

    pp User.first.as_json
    
    # => {
     "id" => 1,
     "first_name" => "Polar",
     "last_name" => "Bear"
    }
    
  7. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    10.

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

    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. ==============================

    12.나는 보석 CodeRay을 사용하고 꽤 잘 작동합니다. 형식은 색상이 포함되어 있으며 다른 형식을 많이 인식하고 있습니다.

    나는 보석 CodeRay을 사용하고 꽤 잘 작동합니다. 형식은 색상이 포함되어 있으며 다른 형식을 많이 인식하고 있습니다.

    나는 레일 API를 디버깅하는 데 사용할 수있는 보석에 그것을 사용하고 꽤 잘 작동합니다.

    그런데, 보석의 이름은 'api_explorer'(http://www.github.com/toptierlabs/api_explorer)

  13. ==============================

    13.당신이 찾고 있다면 신속하게 JSON 응답을 보낼 수있는 레일 컨트롤러 액션이 구현 :

    당신이 찾고 있다면 신속하게 JSON 응답을 보낼 수있는 레일 컨트롤러 액션이 구현 :

    def index
      my_json = '{ "key": "value" }'
      render json: JSON.pretty_generate( JSON.parse my_json )
    end
    
  14. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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
    
  19. from https://stackoverflow.com/questions/86653/how-to-pretty-format-json-output-in-ruby-on-rails by cc-by-sa and MIT license