Ruby on Rails-da JSON çıxışını "gözəl" şəkildə necə düzəldə bilərəm?

Ruby-də Rails-da mənim JSON çıxışımı "gözəl" və ya gözəl şəkildə formatlaşdırmaq istərdim.

Hal-hazırda to_json zəng edirəm və JSON mənimlə eyni to_json . Bəzən JSON çıxış axınında bir problem olub olmadığını bilmək çətin ola bilər.

JSON "gözəl" və ya Rails'də gözəl şəkildə formatlaşdırmaq üçün xüsusi bir yol varmı?

455
17 сент. JP Richardson tərəfindən təyin olunan 17 sentyabr. 2008-09-17 22:25 '08 at 10:25 pm 2008-09-17 22:25
@ 16 cavab

pretty_generate() sonrakı versiyalarına quraşdırılmış pretty_generate() funksiyasından istifadə edin. Məsələn:

 require 'json' my_object = { :array => [1, 2, 3, { :sample => "hash"} ], :foo => "bar" } puts JSON.pretty_generate(my_object) 

Nə lazımdır:

 { "array": [ 1, 2, 3, { "sample": "hash" } ], "foo": "bar" } 
744
01 дек. Cavab jpatokal verilir 01 Dekabr. 2009-12-01 06:50 '09 saat 06:50 'da 2009-12-01 06:50

Rack Middleware və Rails 3 ilə, proqramınızın nəzarətçisini dəyişmədən hər bir tələb üçün olduqca JSON çıxara bilərsiniz. Mən belə bir ara parçanı yazdım və brauzerdə JSON və qıvqı buraxılışına gözəl basdırdım.

 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 

Yuxarıdakı kod Rails layihəsinin app/middleware/pretty_json_response.rb yerləşdirilməlidir. Və son addım config/environments/development.rb ildə middleware qeydiyyatdan etməkdir:

border=0
 config.middleware.use PrettyJsonResponse 

Mən bunu production.rb istifadə etməyi məsləhət görmürəm . JSON yenidən hesablanması, istehsal tətbiqinizin cavab müddətini və performansını azalda bilər. Sonda "X-Pretty-Json: doğru" başlığı kimi əlavə mantiq, istəklərə icazə vermək üçün əl istəkləri üçün formatlaşdırma işinə başlamaq üçün təqdim edilə bilər.

(Rails 3.2.8-5.0.0, Ruby 1.9.3-2.2.0, Linux ilə test edilmişdir)

57
23 окт. Cavab verildi . 2012-10-23 14:19 '12 at 14:19 2012-10-23 14:19

JSON.pretty_generate ilə istifadə edilən HTML <pre> tag JSON- JSON.pretty_generate təqdimatında gözəl olacaq. Məşhur boss mənə göstərdiyi zaman xoşbəxt oldum:

 <% if !@data.blank? %> <pre><%= JSON.pretty_generate(@data) %></pre> <% end %> 
52
03 июля '13 в 21:37 2013-07-03 21:37 Cavab Roger Garza tərəfindən 03.07.13 21:37 2013-07-03 21:37 tərəfindən verilir

İstəsəniz:

  • Tətbiqinizdən gələn bütün gedən JSON cavablarını avtomatik olaraq sadələşdirin.
  • Nümunənin # to_json / # as_json kontaminasiyasından çəkin
  • JSON-lərin ara proqramları (YUCK!) İstifadə edərək təhlil etməkdən və yenidən göstərmədən çəkinməyin
  • RAILS WAY ilə bunu!

Sonra ... əvəz ActionController :: Renderer for JSON! ApplicationController üçün aşağıdakı kodu əlavə edin:

 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 
17
11 апр. Ed Leybertin aprelin 11-də verdiyi cavabı 2014-04-11 19:42 '14 at 19:42 2014-04-11 19:42

JSON (Rails konsolunda) bir ActiveRecord obyektini buraxın:

 pp User.first.as_json # => { "id" => 1, "first_name" => "Polar", "last_name" => "Bear" } 
7
04 апр. Thomas Klemm tərəfindən verilmiş cavab 04.04 2014-04-04 16:31 '14 at 16:31 2014-04-04 16:31

Awesome_print'i yoxlayın. Ruby Hash-da JSON dizesini bölün, sonra isə aşağıdakı kimi awesome_print ilə göstərin:

 require "awesome_print" require "json" json = '{"holy": ["nested", "json"], "batman!": {"a": 1, "b": 2}}' ap(JSON.parse(json)) 

Yuxarıda göstərilənləri görəcəksən:

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

awesome_print də Karu sizə göstərməyəcək bir sıra rəng əlavə edəcək :)

6
29 июня '16 в 22:01 2016-06-29 22:01 Cavab Sintheadi tərəfindən 29 iyun '16, saat 10:01 'də 2016-06-29 22:01' də verilir

Əgər siz (mənim kimi) Ruby JSON kitabxanasına daxil pretty_generate variant pretty_generate yaxşı olmadığını NeatJSON , mən formatlaşdırma üçün NeatJSON istifadə NeatJSON məsləhət NeatJSON .

gem install neatjson istifadə etmək üçün, JSON.neat_generate əvəzinə JSON.neat_generate istifadə edin.

Ruby pp , obyektləri və diziləri eyni nöqtədə qaldıqda, lakin zəruri hallarda bir neçə qədər daşınır. Məsələn:

Çıxışınızı daha da özelleştirmek üçün bir çox biçimlendirme seçeneklerini de destekler.  Məsələn, kolondan əvvəl / sonra neçə boşluq var?  Virgüllerden əvvəl / sonra?  Diziler və obyektlərin parantezləri daxilində?  Niyyətinizin düymələrini sıralamaq istəyirsiniz?  Bütün kolonların hizalı olmasını istəyirsinizmi? 

5
16 апр. cavab aprelin 16-da Phrogz tərəfindən verilir 2015-04-16 18:46 '15 at 18:46 2015-04-16 18:46

Bu, @ gertas- dan bu əla cavabdan dəyişdirilən ara həlldir. Bu həll Rails xüsusi deyil - hər hansı bir Rack tətbiqi ilə işləməlidir.

Burada #each istifadə edilən ara proqram üsulu ASCIIcasts 151-də izah edilir : Eifion Bedford-dan olan rafın ara proqramı.

Bu kod, app / middleware / pretty_json_response.rb ünvanına gedir:

 class PrettyJsonResponse def initialize(app) @app = app end def call(env) @status, @headers, @response = @app.call(env) [@status, @headers, self] end def each( @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 

Bunu təmin etmək üçün config / environment / test.rb və config / environment / development.rb ünvanlarına əlavə edin:

 config.middleware.use "PrettyJsonResponse" 

@Gertas bu həll variantının xəbərdarlıq etdiyi kimi, onu istehsalda istifadə etməyin. Bir az yavaş.

Rails ilə test edilmişdir 4.1.6.

4
21 окт. Wayne Conrad tərəfindən verilmiş cavab Oct 21 2014-10-21 19:37 '14 saat 19:37 'da 2014-10-21 19:37

<pre> html kodu və pretty_generate istifadə edərək yaxşı bir oyun:

 <% require 'json' hash = JSON[{hey: "test", num: [{one: 1, two: 2, threes: [{three: 3, tthree: 33}]}]}.to_json] %> <pre> <%= JSON.pretty_generate(hash) %> </pre> 
2
03 авг. Cavab verilir araratan 03 aug. 2016-08-03 04:50 '16 'da 4:50' də 2016-08-03 04:50

Öz axtarışımda digər vəzifələrdən aldığım qərarım budur.

Bu, lazım olduğunda pp və jj fayllarını bir faylya göndərməyə imkan verir.

 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 
1
23 дек. Christopher Mullins tərəfindən Cavab 23 dekabr 2012-12-23 07:01 '12 saat 07:01 'da 2012-12-23 07:01

Bir JSON cavab göndərmək üçün bir Rails nəzarətçi fəaliyyətində bunu tez bir şəkildə həyata keçirmək istəyirsinizsə:

 def index my_json = '{ "key": "value" }' render json: JSON.pretty_generate( JSON.parse my_json ) end 
1
17 февр. cavab 17 fevral, sealocal tərəfindən verilir. 2016-02-17 03:26 '16 'da 3:26' də 2016-02-17 03:26 'də

CodeRay gemini istifadə etdim və çox yaxşı işləyirəm. Format rənglərdən ibarətdir və bir çox müxtəlif formatları tanıyır.

Mən bunu relslərin API-lərini pozmaq üçün istifadə edə biləcəyiniz bir daş üzərində istifadə etdim və çox yaxşı işləyir.

Yeri gəlmişkən, daş "api_explorer" ( http://www.github.com/toptierlabs/api_explorer ) adlanır.

1
22 нояб. Cavab Tony 22 noyabrda verilir. 2013-11-22 01:08 '13 at 1:08 2013-11-22 01:08

Aşağıdakıları istifadə edirəm: başlıqları, statusu və JSON çıxışı çox faydalı olduğu üçün faydalıdır. Zəng proseduru railscasts təqdimatının tövsiyələrinə görə bölünür: http://railscasts.com/episodes/151-rack-middleware?autoplay=true

  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( 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( end end 
0
01 апр. Cavab TheDadman tərəfindən verilir 01 Apr. 2014-04-01 07:05 '14 at 7:05 2014-04-01 07:05
 # 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}: #{[Array, Hash].include?(value.class) ? value.pretty_html(indent+1) : value}" end elsif self.class == Array result = "[#{self.join(', ')}]" end "#{result}" end end class Hash include MyPrettyPrint end class Array include MyPrettyPrint end 
0
30 нояб. Sergei Belevskij tərəfindən verilmiş cavab 30 noyabr 2015-11-30 10:10 '15 at 10:10 AM 2015-11-30 10:10
 #At Controller def branch @data = Model.all render json: JSON.pretty_generate(@data.as_json) end 
0
16 мая '17 в 14:43 2017-05-16 14:43 Buyanbat Çoyzhilsren tərəfindən 16 may 17: 17-da 14:43 2017-05-16 14:43 cavab verildi

RABL istifadə etsəniz , burada JSON.pretty_generate istifadə etmək üçün burada təsvir edildiyi kimi konfiqurasiya edə bilərsiniz:

 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 istifadə edərək problem JSON sxeminin doğrulayıcılarının artıq datetime strings ilə razı olmağınızdan ibarətdir. Siz konfiqurasiya / initializers / rabl_config.rb ilə bunları düzəldə bilərsiniz:

 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 
0
04 сент. Cavab Jim Flood tərəfindən verilir 04 Sep. 2015-09-04 21:03 '15 'da 21:03' de