rfc8785? -> boolRuby 4.1 から[permalink][rdoc][edit]rfc8785=(enable)-
JSON 形式の文字列を [RFC8785] の JSON Canonicalization Scheme に従って正規化して生成するかどうかを取得・設定します。
真を設定すると、次のように JSON 形式の文字列を生成します。
- オブジェクト(ハッシュ)のキーを UTF-16 のコード単位の順に並べ替えます。入れ子のハッシュのキーも並べ替えます。
- 数値を ECMAScript の Number の文字列表現と同じ形式で出力します。 整数も Float に変換してから出力するため、丸められることがあります。
- トークンの間に空白を入れません。
JSON::Fragmentの内容は、そのまま挿入されます。正規形にするのは呼び出し側の責任です。キーの並べ替えはこの設定自体が行うため、
rfc8785?が真でも JSON::State#sort_keys は偽のままです。- [PARAM]
enable: - 真を指定すると正規化した JSON 形式の文字列を生成するようにします。偽を指定すると正規化しないようにします。
- [EXCEPTION]
ArgumentError: -
indent,space,space_before,object_nl,array_nlのいずれかが空文字列でない場合や、ascii_only,script_safe,allow_nanのいずれかが真の場合に、JSON 形式の文字列を生成するときに発生します。 JSON::State.new や JSON::State#configure でこれらと同時に指定した場合は、そのときに発生します。 - [EXCEPTION]
JSON::GeneratorError: - NaN, Infinity, -Infinity を生成しようとした場合や、 Float で表せない大きさの整数を生成しようとした場合に発生します。
例 キーの並べ替えと数値の形式require "json" p JSON::State.new(rfc8785: true).rfc8785? # => true state = JSON::State.new p state.rfc8785? # => false state.rfc8785 = true p state.generate({"b" => 1, "a" => 2.0}) # => "{\"a\":2,\"b\":1}" state.rfc8785 = false p state.generate({"b" => 1, "a" => 2.0}) # => "{\"b\":1,\"a\":2.0}"
例 例外が発生する場合require "json" p JSON.generate({b: 1, "a" => 2, "B" => 3, "あ" => 4, "ab" => 5}, rfc8785: true) # => "{\"B\":3,\"a\":2,\"ab\":5,\"b\":1,\"あ\":4}" p JSON.generate([1.0, -0.0, 1.0e100, 1e-5, 1e-7, 1e21, 1e20, 123456789012345678, 0.1+0.2, 2.5e-8, 1.5e300], rfc8785: true) # => "[1,0,1e+100,0.00001,1e-7,1e+21,100000000000000000000,123456789012345680,0.30000000000000004,2.5e-8,1.5e+300]"require "json" JSON.generate([10**400], rfc8785: true) # ~> Integer out of range for RFC 8785 (JSON::GeneratorError) JSON.pretty_generate({"a" => 1}, rfc8785: true) # ~> indent cannot be used with rfc8785 (ArgumentError)[SEE_ALSO] JSON::State#sort_keys=, JSON?.generate