🖥

#Ruby Json parse + object_class ( NameError: no member 'xxx' in ) ( e

2023/09/01に公開
  • JSON paras するときの object_class の指定だと、 Struct に定義していないキーが JSON に含まれる場合に、エラーを起こしてしまうようだ ( initialize するときに余計なキーが指定されるわけだから、当たり前か )
  • object_class の指定に任せず、Struct を直接利用すれば、頑張って必要なキーだけで Struct を組み立てる事はできる
  • 他になにか良い指定ないんだろうか
require "JSON"

# OK
User = Struct.new("User", :id, :name, :email)

json_string = { id: 1, name: "Alice", email: "aaa@example.com"}.to_json

user = JSON.parse(json_string, object_class: User)
# => #<struct Struct::User id=1, name="Alice", email="aaa@example.com">


# NG
# undefined Struct key in JSON
User = Struct.new("User", :id, :name, :email)

json_string = { id: 1, name: "Alice", email: "aaa@example.com", undefined_key: "xxx"}.to_json

user = JSON.parse(json_string, object_class: User)
# NameError: no member 'undefined_key' in struct

# OK
# generate struct by yourself
User = Struct.new("User", :id, :name, :email)

json_string = { id: 1, name: "Alice", email: "aaa@example.com", undefined_key: "xxx"}.to_json

user_attributes = JSON.parse(json_string)
# => {"id"=>1, "name"=>"Alice", "email"=>"aaa@example.com", "undefined_key"=>"xxx"}

User.new(user_attributes["id"], user_attributes["name"], user_attributes["email"])
# => #<struct Struct::User id="xxx", name="zzz", email="aaa">

Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3086

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2020-04-23

Discussion