RubyのJSONシリアル化の状況を理解しようとしています。私はRubyが初めてです。
Railsを使用していない場合、適切なJSONシリアル化オプションはありますか?
それがこの答えが(Railsに)行くところだと思われる RubyオブジェクトをJSONに変換する方法
Json gemは、独自のto_jsonメソッドを作成する必要があるように見えます。 to_jsonを配列とハッシュで動作させることができませんでした(ドキュメントではこれらと動作すると言われています)json gemがオブジェクトを反映してデフォルトのシリアル化戦略を使用しない理由はありますか?これはto_yamlの仕組みではありませんか(ここで推測)
JSONライブラリを使用するには、パッケージマネージャーからlibjson-Ruby
をインストールする必要があります。
「json」ライブラリを使用するには:
require 'json'
オブジェクトをJSONに変換するには(これら3つの方法は同等です):
JSON.dump object #returns a JSON string
JSON.generate object #returns a JSON string
object.to_json #returns a JSON string
JSONテキストをオブジェクトに変換するには(これら2つの方法は同等です):
JSON.load string #returns an object
JSON.parse string #returns an object
独自のクラスのオブジェクトの場合はもう少し難しくなります。次のクラスでは、to_jsonは"\"#<A:0xb76e5728>\""
のようなものを生成します。
class A
def initialize a=[1,2,3], b='hello'
@a = a
@b = b
end
end
これはおそらく望ましくありません。オブジェクトをJSONとして効果的にシリアル化するには、独自のto_jsonメソッドを作成する必要があります。これを行うには、from_jsonクラスメソッドが役立ちます。次のようにクラスを拡張できます。
class A
def to_json
{'a' => @a, 'b' => @b}.to_json
end
def self.from_json string
data = JSON.load string
self.new data['a'], data['b']
end
end
「JSONable」クラスから継承することにより、これを自動化できます。
class JSONable
def to_json
hash = {}
self.instance_variables.each do |var|
hash[var] = self.instance_variable_get var
end
hash.to_json
end
def from_json! string
JSON.load(string).each do |var, val|
self.instance_variable_set var, val
end
end
end
次に、object.to_json
を使用してJSONにシリアル化し、object.from_json! string
を使用して、JSON文字列として保存された保存済み状態をオブジェクトにコピーできます。
Oj を確認してください。古いオブジェクトをJSONに変換することに関しては落とし穴がありますが、Ojはそれを行うことができます。
require 'oj'
class A
def initialize a=[1,2,3], b='hello'
@a = a
@b = b
end
end
a = A.new
puts Oj::dump a, :indent => 2
この出力:
{
"^o":"A",
"a":[
1,
2,
3
],
"b":"hello"
}
ご了承ください ^o
は、オブジェクトのクラスを指定するために使用され、逆シリアル化を支援するためにあります。省略します ^o
、 つかいます :compat
モード:
puts Oj::dump a, :indent => 2, :mode => :compat
出力:
{
"a":[
1,
2,
3
],
"b":"hello"
}
Rubyのどのバージョンを使用していますか?Ruby -v
が教えてくれます。
1.9.2の場合、 JSONは標準ライブラリに含まれています 。
1.8.somethingを使用している場合は、gem install json
を実行するとインストールされます。次に、コードで以下を実行します。
require 'rubygems'
require 'json'
次に、to_json
をオブジェクトに追加すると、準備完了です。
asdf = {'a' => 'b'} #=> {"a"=>"b"}
asdf.to_json #=> "{"a":"b"}"
Ruby Object to json:
require 'json'
class User
attr_accessor :name, :age
def initialize(name, age)
@name = name
@age = age
end
def as_json(options={})
{
name: @name,
age: @age
}
end
def to_json(*options)
as_json(*options).to_json(*options)
end
end
user = User.new("Foo Bar", 42)
puts user.to_json #=> {"name":"Foo Bar","age":42}
require 'json'
{"foo" => "bar"}.to_json
# => "{\"foo\":\"bar\"}"
クラス(ArrayやHashなど)でビルドを取得してas_json
およびto_json
、 必要がある require 'json/add/core'
(詳細は readme をご覧ください)
1.9.2以降を使用している場合は、to_jsonを使用するだけで、ハッシュと配列をネストされたJSONオブジェクトに変換できます。
{a: [1,2,3], b: 4}.to_json
Railsでは、Active Recordオブジェクトでto_jsonを呼び出すことができます。 :includeおよび:onlyパラメーターを渡して、出力を制御できます。
@user.to_json only: [:name, :email]
次のように、ARリレーションでto_jsonを呼び出すこともできます。
User.order("id DESC").limit(10).to_json
何もインポートする必要はなく、すべてが希望どおりに機能します。
Jbuilder は、Railsコミュニティによって構築されたgemです。
# suppose we have a sample object as below
sampleObj.name #=> foo
sampleObj.last_name #=> bar
# using jbuilder we can convert it to json:
Jbuilder.encode do |json|
json.name sampleObj.name
json.last_name sampleObj.last_name
end #=> "{:\"name\" => \"foo\", :\"last_name\" => \"bar\"}"
virtus
を使用していました。本当に強力なツールで、指定されたクラスに基づいて動的なRuby構造構造を作成できます。簡単なDSL、Rubyハッシュ、厳密なモード: it outを確認します。
実際、Jsonableという宝石があります https://github.com/treeder/jsonable 。とても甘いです。