Question Comment puis-je "joli" formater ma sortie JSON dans Ruby on Rails?


Je voudrais que ma sortie JSON dans Ruby on Rails soit "jolie" ou bien formatée.

En ce moment, j'appelle to_json et mon JSON est sur une ligne. Parfois, cela peut être difficile de voir s'il y a un problème dans le flux de sortie JSON.

Est-il possible de configurer ou une méthode pour rendre mon JSON "joli" ou bien formaté dans Rails?


514
2017-09-17 19:25


origine


Réponses:


Utilisez le pretty_generate() fonction, intégrée dans les versions ultérieures de JSON. Par exemple:

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

Ce qui vous obtient:

{
  "array": [
    1,
    2,
    3,
    {
      "sample": "hash"
    }
  ],
  "foo": "bar"
}

837
2017-12-01 03:50



Grâce à Rack Middleware et Rails 3, vous pouvez générer un joli JSON pour chaque requête sans changer de contrôleur de votre application. J'ai écrit de tels extraits de middleware et j'obtiens JSON joliment imprimé dans le navigateur et curl sortie.

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

Le code ci-dessus doit être placé dans app/middleware/pretty_json_response.rb de votre projet Rails. Et la dernière étape consiste à enregistrer le middleware dans config/environments/development.rb:

config.middleware.use PrettyJsonResponse

Je ne recommande pas de l'utiliser dans production.rb. Le reparsing JSON peut dégrader le temps de réponse et le débit de votre application de production. Finalement, une logique supplémentaire telle que l'en-tête 'X-Pretty-Json: true' peut être introduite pour déclencher le formatage pour les demandes de roulage manuel à la demande.

(Testé avec Rails 3.2.8-5.0.0, Ruby 1.9.3-2.2.0, Linux)


66
2017-10-23 11:19



le <pre> tag en HTML, utilisé avec JSON.pretty_generate, rendra le JSON joli à votre avis. J'étais si heureux quand mon illustre patron m'a montré ceci:

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

58
2017-07-03 18:37



Si tu veux:

  1. Prétend automatiquement toutes les réponses JSON sortantes de votre application.
  2. Eviter de polluer l'objet # to_json / # as_json
  3. Évitez d’analyser / de restituer JSON en utilisant un middleware (YUCK!)
  4. Faites-le le chemin de RAILS!

Ensuite ... remplacez le ActionController :: Renderer pour JSON! Ajoutez simplement le code suivant à votre 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

19
2018-04-11 16:42



Déposez un objet ActiveRecord sur JSON (dans la console Rails):

pp User.first.as_json

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

9
2018-04-04 13:31



Si vous (comme moi) trouvez que le pretty_generate L’option intégrée à la bibliothèque JSON de Ruby n’est pas assez jolie, NeatJSON gem pour votre mise en forme.

Pour l'utiliser gem install neatjson puis utilisez JSON.neat_generate au lieu de JSON.pretty_generate.

Comme Ruby pp il conservera les objets et les tableaux sur une ligne quand ils sont en forme, mais enveloppera autant de fois que nécessaire. Par exemple:

{
  "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?"}
  ]
}

Il prend également en charge une variété de options de formatage pour personnaliser davantage votre sortie. Par exemple, combien d'espaces avant / après des deux-points? Avant / après les virgules? À l'intérieur des parenthèses de tableaux et d'objets? Voulez-vous trier les clés de votre objet? Voulez-vous que les deux-points soient tous alignés?


9
2018-04-16 15:46



Check-out impressionnant. Analyser la chaîne JSON dans un hachage Ruby, puis l'afficher avec awesome_print comme ceci:

require "awesome_print"
require "json"

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

ap(JSON.parse(json))

Avec ce qui précède, vous verrez:

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

awesome_print ajoutera également de la couleur que Stack Overflow ne vous montrera pas :)


9
2018-06-29 19:01



En utilisant <pre> code html et pretty_generate est bon tour:

<%
  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
2017-08-03 01:50