JSON を構造体に逆シリアル化しますか?
概要
JSON 文字列をデフォルト (ハッシュ、基本的に attr_accessors などを使用してオブジェクトのメソッドとしてハッシュ キーにアクセスできるもの) ではなく構造体に逆シリアル化するにはどうすればよいですか。
つまり、データにアクセスするために obj.my_json_property を記述できるようにしたいのです。
解決策
OpenStruct が受け入れられる場合 (それでも構造体を obj.my_json_property として使用できる、つまり元の要件を満たしている) 場合は、次のアプローチを使用します。
require 'json'
obj = JSON.parse(json_text, object_class: OpenStruct)
puts obj.my_json_property
代わりに object_class: Struct を試してみましたが、「TypeError: allocator unknown for Struct」というメッセージが表示されます。ただし、ほとんど (すべてではありません) 実用的な目的には、OpenStruct で問題ありません。主な欠点は、プロパティ名のいずれかのスペルを間違えた場合、コードは問題なく実行され、値は単に nil/空の文字列 (コンテキストに応じて) になるだけであることです。これは少し面倒で誤解を招く可能性があります。
これは、Hash#[] と Hash#fetch の比較に似ています (参考: http://devblog.avdi.org/2009/03/16/go-fetch/)。