Techioz Blog

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/)。