Ruby 4.1 リファレンスマニュアル

singleton method JSON::Coder.new

new(object_class: nil, array_class: nil, on_load: nil, strict: true, **options) {|object, is_key| ... } -> JSON::CoderRuby 4.0 から[permalink][rdoc][edit]

自身を初期化します。

options には、JSON 形式の文字列を生成する際(JSON?.generate)とパースする際(JSON?.parse)の両方に使われるオプションをキーワード引数で指定します。ただし、生成に関しては常に strict: true を指定した場合と同様に扱われます。すなわち、文字列・シンボル・整数・浮動小数点数・配列・ハッシュ・true・false・nil 以外のオブジェクトを変換しようとすると、ブロックが指定されていない限り JSON::GeneratorError が発生します。

ブロックを指定すると、上記のような JSON にネイティブ対応していない型のオブジェクトを生成しようとしたときにそのブロックが呼び出されます。ブロックには対象のオブジェクトと、それがハッシュのキーとして使われているかどうかを表す真偽値が渡されます。ブロックの返り値が、そのオブジェクトの代わりに変換されます。返り値の中にさらにネイティブ対応していないオブジェクトが含まれていれば、それに対してもブロックが呼び出されます。JSON::Fragment を返すと、その内容がそのまま挿入されます。ハッシュのキーに対する返り値は String か Symbol でなければなりません。不正なエンコーディングの文字列や、ASCII 以外のバイトを含む BINARY(ASCII-8BIT)エンコーディングの文字列に対してもブロックが呼び出されます。ブロックの返り値もネイティブ対応していない型であった場合は JSON::GeneratorError が発生します。

strict に true 以外を指定すると ArgumentError が発生します。オプションのハッシュを位置引数で渡した場合も ArgumentError が発生します。

[PARAM] object_class:
JSON のオブジェクトを変換するクラスを指定します。JSON?.parse の object_class と同じです。
[PARAM] array_class:
JSON の配列を変換するクラスを指定します。JSON?.parse の array_class と同じです。
[PARAM] on_load:
パースで生成した値ごとに呼び出す手続きオブジェクトを指定します。JSON?.parse の on_load と同じです。
[PARAM] strict:
true のみ指定できます。
[PARAM] options:
その他のオプションをキーワード引数で指定します。指定可能なオプションは JSON?.generate, JSON?.parse を参照してください。
[EXCEPTION] ArgumentError:
strict に true 以外を指定した場合や、オプションのハッシュを位置引数で渡した場合、未知のキーワードを指定した場合に発生します。
例 options はパースと生成の両方に適用される
require "json"

coder = JSON::Coder.new(symbolize_names: true)
p coder.load('{"name":"Ruby","version":"3.4"}') # => {name: "Ruby", version: "3.4"}
p coder.dump(name: "Ruby", version: "3.4")       # => "{\"name\":\"Ruby\",\"version\":\"3.4\"}"
例 ブロックを指定しない場合、未対応の型はエラーになる
require "json"

coder = JSON::Coder.new
begin
  coder.dump(1..3)
rescue JSON::GeneratorError => e
  p e.message # => "Range not allowed in JSON"
end
例 ハッシュのキーと値でブロックの引数が異なる
require "json"

coder = JSON::Coder.new do |object, is_key|
  is_key ? object.to_s : object.to_a
end
p coder.dump({1..2 => 3..4, "k" => 5..6}) # => "{\"1..2\":[3,4],\"k\":[5,6]}"
例 JSON::Fragment で生成済みの JSON を埋め込む
require "json"

cached = '{"id":1,"name":"Ruby"}'
coder = JSON::Coder.new { |object| JSON::Fragment.new(cached) }
p coder.dump({"item" => Object.new}) # => "{\"item\":{\"id\":1,\"name\":\"Ruby\"}}"

[SEE_ALSO] JSON::State#as_json=, JSON::State#strict=