概要
過去にBlueprinterを使ってシリアライズ方法を紹介しました
その際はオブジェクトをJSONにシリアライズする方法だけを紹介しました
今回は JSON -> オブジェクトのデシリアライズも可能な oj を使ってみます
環境
- macOS 11.6.8
- Ruby 3.1.2
- oj 3.13.21
サンプルコード
- vim app.rb
require 'oj'
class User
attr_reader :name, :age
def initialize(name, age)
@name = name
@age = age
end
end
user = User.new('hawk', 10)
user_json = Oj.dump(user)
p user_json
user_obj = Oj.load('{"^o":"User","name":"snowlog","age":20}')
p user_obj.name
p user_obj.age
compat_user_obj = Oj.load('{"^o":"User","name":"taro","age":30}', mode: :compat)
p compat_user_obj
ちょっと解説
JSON にシリアライズする場合は単純に dump すれば OK です
ポイントは JSON 文字列からオブジェクトに変換する場合で先頭のフィールドで "^o":"User"
という属性が必要です
これを指定しないと Hash に変換します
もし load 時にクラスに定義していないフィールドがあってもそのフィールドは無視してデシリアライズしてくれます
もしキャレットから始まるフィールドがある場合には object_mode というオプションが指定できるのでそれを使用します
最後の compat オプションはよく見るオプションで値がコロンから始まる場合に自動的に Symbol に変換してくれるのを防いでくれます
最後に
Oj は JSON パーサとして速度も速いのでデシリアライズするような処理をやりたい場合には Oj を積極的に使っても良いかなと思います
0 件のコメント:
コメントを投稿