ruby on rails - আমি কিভাবে রবিতে রুবিতে আমার "JSON" আউটপুটটি "সুন্দর" ফর্ম্যাট করতে পারি?




ruby-on-rails pretty-print (11)

JSON এ একটি ActiveRecord বস্তু ডাম্পিং (রেলস কনসোলে):

pp User.first.as_json

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

আমি রুবিতে রুবিতে আমার JSON আউটপুটটি "সুন্দর" বা চমত্কারভাবে বিন্যাসিত করতে চাই।

এই মুহূর্তে, আমি to_json এবং আমার JSON এক লাইন সব কল। কখনও কখনও JSON আউটপুট প্রবাহে কোন সমস্যা আছে কিনা তা দেখতে কঠিন হতে পারে।

কনফিগার করার পদ্ধতি বা আমার JSON "চমত্কার" বা চমত্কারভাবে Rails এ ফর্ম্যাট করার একটি পদ্ধতি আছে?


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"
}

আপনি যদি RABL ব্যবহার করেন তবে RABL ব্যবহার করতে here বর্ণিত হিসাবে এটি কনফিগার করতে পারেন:

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 স্কিমা বৈধতাগুলি আপনার ডেটাটাইম স্ট্রিংগুলির সাথে আর খুশি হবে না। আপনি আপনার কনফিগারেশন / initializers / 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

আমি মোম CodeRay ব্যবহার করেছেন এবং এটি বেশ ভাল কাজ করে। বিন্যাস রং অন্তর্ভুক্ত করে এবং এটি বিভিন্ন বিন্যাস অনেক স্বীকৃতি দেয়।

আমি এটি একটি মণি ব্যবহার করেছি যা ডিবাগিং রেল APIs ব্যবহার করতে পারে এবং এটি বেশ ভাল কাজ করে।

যাইহোক, মণির নাম 'api_explorer' ( http://www.github.com/toptierlabs/api_explorer )


এইচটিএমএল <pre> ট্যাগটি, JSON.pretty_generate সাথে ব্যবহৃত, আপনার দৃশ্যে সুন্দর JSON রেন্ডার করবে। আমার অসাধারণ বস আমাকে দেখিয়েছিল যখন আমি খুব খুশি হলাম:

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

এখানে আমার সমাধানটি যা আমি নিজের অনুসন্ধানের সময় অন্য পোস্ট থেকে উদ্ভূত।

এটি আপনাকে প্রয়োজন অনুসারে পিপি এবং জেজে আউটপুট পাঠাতে দেয়।

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. স্বয়ংক্রিয়ভাবে আপনার অ্যাপ্লিকেশন থেকে সব বহির্মুখী JSON প্রতিক্রিয়া প্রিমিফাই।
  2. দূষিত বস্তুকে এড়িয়ে চলুন # to_json / # as_json
  3. মিডলওয়্যার ব্যবহার করে JSON পার্সিং / পুনরায় রেন্ডারিং এড়িয়ে চলুন (YUCK!)
  4. এটা কি রেলপথ!

তারপর ... JSON এর জন্য অ্যাকশন কন্ট্রোলার :: রেন্ডারার প্রতিস্থাপন করুন! শুধু আপনার অ্যাপ্লিকেশন কন্ট্রোলার এ নিম্নলিখিত কোড যোগ করুন:

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

র্যাক মিডিলওয়্যার এবং রেলের ধন্যবাদ 3 আপনি আপনার অ্যাপ্লিকেশন কোন নিয়ামক পরিবর্তন ছাড়া প্রতিটি অনুরোধের জন্য সুন্দর JSON আউটপুট করতে পারেন। আমি যেমন middleware স্নিপেট লিখেছেন এবং আমি চমত্কারভাবে ব্রাউজার এবং 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 প্রকল্পের app/middleware/pretty_json_response.rb স্থাপন করা উচিত। এবং চূড়ান্ত ধাপ config/environments/development.rb এ মিডলওয়্যার নিবন্ধন করা হয়:

config.middleware.use PrettyJsonResponse

আমি production.rb এটি ব্যবহার করার সুপারিশ করি না । JSON reparsing আপনার উত্পাদন অ্যাপ্লিকেশন প্রতিক্রিয়া সময় এবং থ্রুপুট হ্রাস হতে পারে। অবশেষে অতিরিক্ত এক্সিকিউটিভ 'এক্স-প্রিটি-জসন: সত্য' শীর্ষক ম্যানুয়াল কার্ল অনুরোধগুলির জন্য ফর্ম্যাটিং ট্রিগার করতে শুরু করা যেতে পারে।

(রেলের 3.2.8-5.0.0, রুবি 1.9.3-2.2.0, লিনাক্সের সাথে পরীক্ষিত)


<pre> এইচটিএমএল কোড এবং 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>

pretty_generate JSON লাইব্রেরীতে নির্মিত pretty_generate বিকল্পটি যদি "সুন্দর" না হয় তবে আমি আপনার ফর্ম্যাটিংয়ের জন্য আমার নিজের NeatJSON সুপারিশ করি।

এটি ব্যবহার করার জন্য gem install neatjson এবং তারপর JSON.neat_generate পরিবর্তে JSON.neat_generate ব্যবহার করুন।

রুবি এর pp লাইক করলে এটি এক লাইনে বস্তু এবং অ্যারে রাখা হবে, তবে প্রয়োজনীয় হিসাবে একাধিক মোড়ানো হবে। উদাহরণ স্বরূপ:

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

এটি আপনার আউটপুট আরও কাস্টমাইজ করার জন্য বিভিন্ন বিন্যাস বিকল্পগুলি সমর্থন করে। উদাহরণস্বরূপ, কোলন আগে / পরে কত স্পেস? আগে / কমা পরে? অ্যারে এবং বস্তুর বন্ধনী ভিতরে? আপনি আপনার বস্তুর কী সাজান করতে চান? আপনি কি কর্নেলদের সবাইকে লাইন আপ করতে চান?



# example of use:
a_hash = {user_info: {type: "query_service", e_mail: "[email protected]", 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




pretty-print