最初のチャンクはRails 3.1用です(古いバージョンはほぼ同じです)。 2番目のチャンクは標準の非Rails JSON向けです。 tl; drならば最後にスキップしてください。
あなたの問題は、Railsがこのないことである:active_support/core_ext/object/to_json.rb
で
[Object, Array, FalseClass, Float, Hash, Integer, NilClass, String, TrueClass].each do |klass|
klass.class_eval <<-RUBY, __FILE__, __LINE__
# Dumps object in JSON (JavaScript Object Notation). See www.json.org for more info.
def to_json(options = nil)
ActiveSupport::JSON.encode(self, options)
end
RUBY
end
。特に、これはHashのto_json
メソッドをActiveSupport::JSON.encode
呼び出しに変更します。
はその後、ActiveSupport::JSON::Encoding::Encoder
を見て、我々はこれを参照してください。
def encode(value, use_options = true)
check_for_circular_references(value) do
jsonified = use_options ? value.as_json(options_for(value)) : value.as_json
jsonified.encode_json(self)
end
end
だから、すべてのRailsのJSONエンコーディングはas_json
を通過します。しかし、あなた自身がas_json
をSetに定義していない場合は、to_json
を設定するだけで、Railsが使用しないものを無視すると混乱することになります。
あなたがあなた自身のSet#as_json
を設定した場合:
class Set
def as_json(options = { })
{
"json_class" => self.class.name,
"data" => { "elements" => self.to_a }
}
end
end
を、あなたはあなたが一般的にRailsのコンソールとRailsで後にしているものを取得しますが:
> require 'set'
> s = Set.new([1,2,3])
> s.to_json
=> "{\"json_class\":\"Set\",\"data\":{\"elements\":[1,2,3]}}"
> h = { :set => s }
> h.to_json
=> "{\"set\":{\"json_class\":\"Set\",\"data\":{\"elements\":[1,2,3]}}}"
がas_json
ことに注意してくださいJSONシリアル化のオブジェクトを準備するために使用され、次にto_json
が実際のJSON文字列を生成します。 as_json
のメソッドは、一般的にハッシュや配列などのシンプルなシリアライズ可能なデータ構造を返し、JSONに直接類似しています。 JSONのような構造になったら、to_json
を使って線形JSON文字列にシリアル化します。我々は標準的な非RailsのJSONライブラリを見てみると
は、我々はこのようなものを参照してください。
def to_json(*a)
as_json.to_json(*a)
end
猿は基本クラス(シンボル、時間、日付、...)にパッチ。ですからもう一度to_json
はas_json
という言葉で実装されています。
class Set
def as_json(options = { })
{
"json_class" => self.class.name,
"data" => { "elements" => self.to_a }
}
end
def to_json(*a)
as_json.to_json(*a)
end
def self.json_create(o)
new o["data"]["elements"]
end
end
そして、我々は、デコーダのためのあなたのjson_create
クラスメソッドが含まれます。この環境では、我々はセットのto_json
標準と同様にas_json
上記を含める必要があります。それがすべて正しくセットアップしたら、我々はirb
にこのようなものを得る:
>> s = Set.new([1,2,3])
>> s.as_json
=> {"json_class"=>"Set", "data"=>{"elements"=>[1, 2, 3]}}
>> h = { :set => s }
>> h.to_json
=> "{"set":{"json_class":"Set","data":{"elements":[1,2,3]}}}"
エグゼクティブサマリー:あなたはRailsのであれば、as_json
は何か、to_json
で何も心配しないでくださいあなたは一緒に遊びたいです。 Railsに載っていない場合は、ほとんどのロジックをas_json
に実装し、標準to_json
実装(def to_json(*a);as_json.to_json(*a);end
)も追加してください。
使用しているRubyのバージョンはどれですか? 1.8.7でこれを試してみました。たぶんあなたはそのような行動を妨げる何か他のことをしています。 – RocketR