2022年9月13日火曜日

Rubyでojを使えばJSONとオブジェクトの相互変換が簡単にできる

Rubyでojを使えばJSONとオブジェクトの相互変換が簡単にできる

概要

過去に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 件のコメント:

コメントを投稿