aliases: JSON::Ext::Generator::State
要約
Ruby オブジェクトから JSON 形式の文字列を生成する間、 JSON 形式の文字列を生成するための設定を保持しておくために使用するクラスです。
実体は JSON::Ext::Generator::State であり、JSON::State はそれを指す別名(定数)です。そのため、生成したインスタンスの class メソッドや inspect の結果には
JSON::Ext::Generator::State と表示されます。
目次
- 特異メソッド
- インスタンスメソッド
-
- []
- []=
- allow_nan=
- allow_nan?
- array_nl
- array_nl=
- as_json
- as_json=
- ascii_only=
- ascii_only?
- buffer_initial_length
- buffer_initial_length=
- check_circular?
- configure
- depth
- depth=
- generate
- indent
- indent=
- max_nesting
- max_nesting=
- merge
- object_nl
- object_nl=
- script_safe
- script_safe=
- script_safe?
- sort_keys
- sort_keys=
- space
- space=
- space_before
- space_before=
- strict
- strict=
- strict?
- to_h
- to_hash
特異メソッド
default_sort_keys_proc=(prc)Ruby 4.1 から[permalink][rdoc][edit]-
sort_keys=に真を指定したときに使用する、デフォルトの並べ替え用Procを設定します。- [PARAM]
prc: -
ハッシュを引数に取り、並べ替えたハッシュを返す
Procを指定します。 - [EXCEPTION]
TypeError: -
prcがProcでない場合に発生します。
require "json" JSON::State.default_sort_keys_proc = ->(hash) { hash.sort.to_h } state = JSON::State.new(sort_keys: true) p JSON.generate({b: 1, a: 2}, state) # => "{\"a\":2,\"b\":1}"[SEE_ALSO] JSON::State#sort_keys=
- [PARAM]
from_state(options) -> JSON::StateRuby 1.9.3 から[permalink][rdoc][edit]-
与えられた options によって生成した JSON::State のインスタンスを返します。
- [PARAM]
options: - JSON::State のインスタンスか、ハッシュを指定します。
- [RETURN]
- options がハッシュである場合は、それによって初期化した JSON::State を返します。options が JSON::State のインスタンスである場合は単に options を返します。いずれでも無い場合は、何も設定されていない JSON::State のインスタンスを返します。
例 JSON::State を指定require "json" json_state = JSON::State.from_state(indent: "\t") json_state.class # => JSON::Ext::Generator::State json_state.indent # => "\t"require "json" json_state = JSON::State.from_state(indent: "\t") # JSON を出力する何らかの処理を実行する same = JSON::State.from_state(json_state) same.equal?(json_state) # => true same.class # => JSON::Ext::Generator::State same.indent # => "\t" - [PARAM]
generate(obj, options, io) -> String | IORuby 3.4 から[permalink][rdoc][edit]-
objとoptionsから一時的な JSON::State を作成し、それを使ってobjから JSON 形式の文字列を生成します。- [PARAM]
obj: - JSON 形式の文字列に変換するオブジェクトを指定します。
- [PARAM]
options: - JSON::State.new に指定するのと同様のオプションをハッシュで指定します。 nil を指定した場合、オプション無しで初期化した JSON::State を使用します。
- [PARAM]
io: -
生成した文字列の書き込み先を、
writeメソッドを持つオブジェクトで指定します。 nil を指定した場合は、生成した文字列をそのまま返します。 - [RETURN]
-
ioを指定しなかった場合は生成した JSON 形式の文字列を返します。ioを指定した場合は、そこに書き込んだ上でioを返します。
require "json" p JSON::State.generate({b: 1, a: 2}, nil, nil) # => "{\"b\":1,\"a\":2}" p JSON::State.generate({b: 1, a: 2}, {indent: " ", object_nl: "\n"}, nil) # => "{\n \"b\":1,\n \"a\":2\n}"[SEE_ALSO] JSON::State.new, JSON::State#generate
- [PARAM]
new(options = {}) -> JSON::StateRuby 1.9.3 から[permalink][rdoc][edit]-
自身を初期化します。
- [PARAM]
options: - ハッシュを指定します。指定可能なオプションは以下の通りです。
:indent-
インデントに使用する文字列を指定します。デフォルトは空文字列です。
:space-
JSON 形式の文字列のトークン間に挿入する文字列を指定します。デフォルトは空文字列です。
:space_before-
JSON 形式の文字列中で JavaScript のオブジェクトを表す部分にある ':' の前に挿入する文字列をセットします。デフォルトは空文字列です。
:object_nl-
JSON 形式の文字列中に現れる JavaScript のオブジェクトの行末に挿入する文字列を指定します。デフォルトは空文字列です。
:array_nl-
JSON 形式の文字列中に現れる JavaScript の配列の行末に挿入する文字列を指定します。デフォルトは空文字列です。
:check_circular-
真を指定した場合、生成するオブジェクトの循環をチェックします。この動作がデフォルトです。
:allow_nan-
真を指定した場合、JSON::NaN, JSON::Infinity, JSON::MinusInfinity を生成することを許すようになります。偽を指定した場合、これらの値を生成しようとすると例外が発生します。デフォルトは偽です。
:ascii_only-
真を指定した場合、ASCII 文字列のみを用いて JSON 形式の文字列を生成します。デフォルトは偽です。
:buffer_initial_length-
JSON 形式の文字列を生成する際に使用する内部バッファの初期の長さを指定します。デフォルトは 1024 です。
例 Hash を指定
例 JSON::State を指定require "json" json_state = JSON::State.new(indent: "\t") json_state.class # => JSON::Ext::Generator::State json_state.indent # => "\t"require "json" json_state = JSON::State.new(indent: "\t") copy = JSON::State.new(json_state) copy.class # => JSON::Ext::Generator::State copy.indent # => "\t"
- [PARAM]
インスタンスメソッド
self[name] -> objectRuby 2.1.0 から[permalink][rdoc][edit]-
name という名前のメソッドを呼び出し、その戻り値を返します。
このメソッドは非推奨です(json 2.16.0 から)。json 3.0.0 で削除される予定で、代わりの手段として JSON::Coder が挙げられています。
self[name] = valueRuby 2.1.0 から[permalink][rdoc][edit]-
属性 name に value をセットします。
このメソッドは非推奨です(json 2.16.0 から)。json 3.0.0 で削除される予定で、代わりの手段として JSON::Coder が挙げられています。
allow_nan? -> boolRuby 1.9.3 から[permalink][rdoc][edit]allow_nan=(enable)Ruby 3.4 から-
NaN, Infinity, -Infinity を生成できる場合、
allow_nan?は真を返します。そうでない場合は偽を返します。allow_nan=は、NaN, Infinity, -Infinity を生成できるかどうかを設定します。- [PARAM]
enable: - 真を指定すると NaN, Infinity, -Infinity を生成できるようにします。偽を指定すると生成できないようにします。
例 allow_nan= を使うrequire "json" json_state = JSON::State.new({}) json_state.allow_nan? # => false json_state = JSON::State.new(allow_nan: true) json_state.allow_nan? # => truerequire "json" json_state = JSON::State.new(allow_nan: true) p json_state.allow_nan? # => true json_state.allow_nan = false p json_state.allow_nan? # => false[SEE_ALSO] [RFC4627]
- [PARAM]
array_nl -> StringRuby 1.9.3 から[permalink][rdoc][edit]-
JSON の配列の後に出力する文字列を返します。
例require "json" json_state = JSON::State.new({}) json_state.array_nl # => "" json_state = JSON::State.new(array_nl: "\n") json_state.array_nl # => "\n" array_nl=(str)Ruby 1.9.3 から[permalink][rdoc][edit]-
JSON の配列の後に出力する文字列をセットします。
例require "json" json_state = JSON::State.new({}) json_state.array_nl # => "" json_state.array_nl = "\n" json_state.array_nl # => "\n" as_json -> Proc | nilRuby 4.0 から[permalink][rdoc][edit]as_json=(prc)-
strict?が真のとき、そのままでは JSON 形式の文字列に変換できないオブジェクトを変換するために使用するProcを取得・設定します。設定した
Procは、変換できないオブジェクトが現れるたびに、そのオブジェクトと、それがハッシュのキーとして使われているかどうかを表す真偽値の 2 引数で呼び出されます。Procの返り値が、代わりに JSON 形式の文字列への変換に使われます。- [PARAM]
prc: -
変換できないオブジェクトを変換するための
Procを指定します。
require "json" state = JSON::State.new(strict: true, as_json: ->(obj, is_key) { obj.to_s }) p state.as_json.class # => Proc p JSON.generate([1, 2..3], state) # => "[1,\"2..3\"]"[SEE_ALSO] JSON::State#strict
- [PARAM]
ascii_only? -> boolRuby 2.1.0 から[permalink][rdoc][edit]ascii_only=(enable)Ruby 3.4 から-
ASCII 文字列のみを用いて JSON 形式の文字列を生成する場合に
ascii_only?は真を返します。そうでない場合に偽を返します。ascii_only=は、ASCII 文字列のみを用いて JSON 形式の文字列を生成するかどうかを設定します。- [PARAM]
enable: - 真を指定すると ASCII 文字列のみを生成するようになります。偽を指定すると、ASCII 以外の文字列もそのまま生成するようになります。
require "json" json_state = JSON::State.new(ascii_only: true) p JSON.generate(["日本語"], json_state) # => "[\"\\u65e5\\u672c\\u8a9e\"]" json_state.ascii_only = false p JSON.generate(["日本語"], json_state) # => "[\"日本語\"]" - [PARAM]
buffer_initial_length -> IntegerRuby 2.1.0 から[permalink][rdoc][edit]-
現在のバッファの初期の長さを整数で返します。
buffer_initial_length=(length)Ruby 2.1.0 から[permalink][rdoc][edit]-
バッファの初期の長さを length にセットします。length が 0 より大きい場合のみ値がセットされ、それ以外の場合は値は変更されません。
check_circular? -> boolRuby 1.9.3 から[permalink][rdoc][edit]-
循環参照のチェックを行う場合は、真を返します。そうでない場合は偽を返します。
例 ネストをチェックするケース
例 ネストをチェックしないケースrequire "json" a = [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[0]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] s = JSON.state.new begin JSON.generate(a, s) rescue JSON::NestingError => e [e, s.max_nesting, s.check_circular?] # => [#<JSON::NestingError: nesting of 100 is too deep>, 100, true] endrequire "json" a = [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[0]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] s2 = JSON.state.new(max_nesting: 0) json = JSON.generate(a, s2) [json, s2.max_nesting, s2.check_circular?] # => ["[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[0]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]", 0, false] configure(options = {}) -> selfRuby 1.9.3 から[permalink][rdoc][edit]merge(options = {}) -> selfRuby 2.1.0 から-
与えられたハッシュで自身を設定します。
オプションで使用するハッシュのキーについては JSON::State.new を参照してください。
- [PARAM]
options: - このオブジェクトの設定をするためのハッシュを指定します。
require "json" json_state = JSON::State.new(indent: "\t") json_state.indent # => "\t" p JSON.generate({key1: "value1", key2: "value2"}, json_state) # => "{\t\"key1\":\"value1\",\t\"key2\":\"value2\"}" json_state.configure(indent: " ") json_state.indent # => " " p JSON.generate({key1: "value1", key2: "value2"}, json_state) # => "{ \"key1\":\"value1\", \"key2\":\"value2\"}"[SEE_ALSO] JSON::State.new
- [PARAM]
depth -> IntegerRuby 2.1.0 から[permalink][rdoc][edit]-
現在のデータ構造のネストの深さを整数で返します。
depth=(depth)Ruby 2.1.0 から[permalink][rdoc][edit]-
データ構造のネストの深さの現在値を整数 depth にセットします。インデントを伴う生成では、この深さを起点として出力されます。ネストの深さの上限(JSON::State#max_nesting)とは別の値です。
generate(obj) -> StringRuby 2.1.0 から[permalink][rdoc][edit]-
オブジェクト obj から有効な JSON 形式の文字列を生成し、その結果を返します。有効な JSON 形式の文字列を生成できない場合は、JSON::GeneratorError 例外が発生します。
indent -> StringRuby 1.9.3 から[permalink][rdoc][edit]-
インデントに使用する文字列を返します。
例require "json" json_state = JSON::State.new(indent: "\t") json_state.indent # => "\t" p JSON.generate({key1: "value1", key2: "value2"}, json_state) # => "{\t\"key1\":\"value1\",\t\"key2\":\"value2\"}" indent=(string)Ruby 1.9.3 から[permalink][rdoc][edit]-
インデントに使用する文字列をセットします。
- [PARAM]
string: - インデントに使用する文字列を指定します。
require "json" json_state = JSON::State.new(indent: "\t") json_state.indent # => "\t" p JSON.generate({key1: "value1", key2: "value2"}, json_state) # => "{\t\"key1\":\"value1\",\t\"key2\":\"value2\"}" json_state.indent = " " p JSON.generate({key1: "value1", key2: "value2"}, json_state) # => "{ \"key1\":\"value1\", \"key2\":\"value2\"}" - [PARAM]
max_nesting -> IntegerRuby 1.9.3 から[permalink][rdoc][edit]-
生成される JSON 形式の文字列のネストの深さの最大値を返します。
この値がゼロである場合は、ネストの深さのチェックを行いません。
例 ネストの深さチェックを行う
例 ネストの深さチェックを行わないrequire "json" json_state = JSON::State.new(max_nesting: 2) json_state.max_nesting # => 2 JSON.generate([[]], json_state) JSON.generate([[[]]], json_state) # ~> JSON::NestingErrorrequire "json" json_state = JSON::State.new(max_nesting: 0) json_state.max_nesting # => 0 JSON.generate([[[[[[[[[[]]]]]]]]]], json_state) max_nesting=(depth)Ruby 1.9.3 から[permalink][rdoc][edit]-
生成される JSON 形式の文字列のネストの深さの最大値をセットします。
この値にゼロをセットすると、ネストの深さのチェックを行いません。
例require "json" json_state = JSON::State.new(max_nesting: 2) json_state.max_nesting # => 2 JSON.generate([[]], json_state) json_state.max_nesting = 3 json_state.max_nesting # => 3 JSON.generate([[[[]]]], json_state) # ~> JSON::NestingError object_nl -> StringRuby 1.9.3 から[permalink][rdoc][edit]-
JSON 形式の文字列中に現れる JavaScript のオブジェクトの行末に挿入する文字列を返します。
例require "json" json_state = JSON::State.new(object_nl: "") json_state.object_nl # => "" puts JSON.generate([1, 2, { name: "tanaka", age: 19 }], json_state) # => [1,2,{"name":"tanaka","age":19}] json_state = JSON::State.new(object_nl: "\n") json_state.object_nl # => "\n" puts JSON.generate([1, 2, { name: "tanaka", age: 19 }], json_state) # => [1,2,{ # "name":"tanaka", # "age":19 # }] object_nl=(string)Ruby 1.9.3 から[permalink][rdoc][edit]-
JSON 形式の文字列中に現れる JavaScript のオブジェクトの行末に挿入する文字列をセットします。
- [PARAM]
string: - JSON 形式の文字列中に現れる JavaScript のオブジェクトの行末に挿入する文字列を指定します。
require "json" json_state = JSON::State.new(object_nl: "") json_state.object_nl # => "" puts JSON.generate([1, 2, { name: "tanaka", age: 19 }], json_state) # => [1,2,{"name":"tanaka","age":19}] json_state.object_nl = "\n" json_state.object_nl # => "\n" puts JSON.generate([1, 2, { name: "tanaka", age: 19 }], json_state) # => [1,2,{ # "name":"tanaka", # "age":19 # }] - [PARAM]
script_safe -> boolRuby 3.3 から[permalink][rdoc][edit]script_safe? -> boolscript_safe=(enable)-
生成する JSON 形式の文字列中のスラッシュ(
/)をエスケープするかどうかを取得・設定します。真を指定すると、スラッシュを\/としてエスケープします。Ruby 3.3 以降は、スラッシュに加えて U+2028, U+2029 もエスケープするようになりました。
escape_slash,escape_slash?,escape_slash=は、この設定がscript_safeという名前になる前から使われている別名です。Ruby 4.1 で削除されます。- [PARAM]
enable: - 真を指定するとエスケープを有効にします。偽を指定すると無効にします。
require "json" state = JSON::State.new(script_safe: true) p state.script_safe? # => true p JSON.generate(["a/b"], state) # => "[\"a\\/b\"]" - [PARAM]
sort_keys -> bool | ProcRuby 4.1 から[permalink][rdoc][edit]sort_keys=(value)-
生成する JSON 形式の文字列で、オブジェクト(ハッシュ)のキーを並べ替えるかどうかを取得・設定します。
valueに真を指定すると、キーを昇順に並べ替えます。Procを指定すると、ハッシュ全体を引数としてそのProcを呼び出し、返り値のハッシュをそのままの順序で使用します。これにより任意の並べ替えができます。偽を指定すると並べ替えを行いません(デフォルト)。- [PARAM]
value: -
真偽値または
Procを指定します。 - [EXCEPTION]
TypeError: -
valueが真偽値でもProcでもない場合に発生します。
require "json" state = JSON::State.new(sort_keys: true) p JSON.generate({b: 1, a: 2}, state) # => "{\"a\":2,\"b\":1}" state2 = JSON::State.new(sort_keys: ->(hash) { hash.sort_by { |k, v| -v }.to_h }) p JSON.generate({a: 1, b: 2}, state2) # => "{\"b\":2,\"a\":1}"[SEE_ALSO] JSON::State.default_sort_keys_proc=
- [PARAM]
space -> StringRuby 1.9.3 から[permalink][rdoc][edit]-
JSON 形式の文字列のトークン間に挿入する文字列を返します。
例require "json" json_state = JSON::State.new(space: "") json_state.space # => "" puts JSON.generate([1, 2, { name: "tanaka", age: 19 }], json_state) # => [1,2,{"name":"tanaka","age":19}] json_state = JSON::State.new(space: "\t") json_state.space # => "\t" puts JSON.generate([1, 2, { name: "tanaka", age: 19 }], json_state) # => [1,2,{"name": "tanaka","age": 19}] space=(string)Ruby 1.9.3 から[permalink][rdoc][edit]-
JSON 形式の文字列のトークン間に挿入する文字列をセットします。
- [PARAM]
string: - JSON 形式の文字列のトークン間に挿入する文字列を指定します。
require "json" json_state = JSON::State.new(space: "") json_state.space # => "" puts JSON.generate([1, 2, { name: "tanaka", age: 19 }], json_state) # => [1,2,{"name":"tanaka","age":19}] json_state.space = "\t" json_state.space # => "\t" puts JSON.generate([1, 2, { name: "tanaka", age: 19 }], json_state) # => [1,2,{"name": "tanaka","age": 19}] - [PARAM]
space_before -> StringRuby 1.9.3 から[permalink][rdoc][edit]-
JSON 形式の文字列中で JavaScript のオブジェクトを表す部分にある ':' の前に挿入する文字列を返します。
例require "json" json_state = JSON::State.new(space_before: "") json_state.space_before # => "" puts JSON.generate([1, 2, { name: "tanaka", age: 19 }], json_state) # => [1,2,{"name":"tanaka","age":19}] json_state = JSON::State.new(space_before: " ") json_state.space_before # => " " puts JSON.generate([1, 2, { name: "tanaka", age: 19 }], json_state) # => [1,2,{"name" :"tanaka","age" :19}] space_before=(string)Ruby 1.9.3 から[permalink][rdoc][edit]-
JSON 形式の文字列中で JavaScript のオブジェクトを表す部分にある ':' の前に挿入する文字列をセットします。
- [PARAM]
string: - JSON 形式の文字列中で JavaScript のオブジェクトを表す部分にある ':' の前に挿入する文字列をセットします。
require "json" json_state = JSON::State.new(space_before: "") json_state.space_before # => "" puts JSON.generate([1, 2, { name: "tanaka", age: 19 }], json_state) # => [1,2,{"name":"tanaka","age":19}] json_state.space_before = " " json_state.space_before # => " " puts JSON.generate([1, 2, { name: "tanaka", age: 19 }], json_state) # => [1,2,{"name" :"tanaka","age" :19}] - [PARAM]
strict -> boolRuby 3.3 から[permalink][rdoc][edit]strict? -> boolstrict=(enable)-
JSON 形式で表現できない型のオブジェクトが現れたときの挙動を取得・設定します。
偽の場合(デフォルト)、JSON 形式で表現できない型のオブジェクトは文字列に変換されて出力されます。真の場合、そのようなオブジェクトが現れると JSON::GeneratorError が発生します。
- [PARAM]
enable: - 真を指定すると、JSON 形式で表現できない型のオブジェクトが現れたときに例外を発生させるようになります。
- [EXCEPTION]
JSON::GeneratorError: -
strict?が真の状態で、JSON 形式で表現できない型のオブジェクトを変換しようとした場合に発生します。
require "json" state = JSON::State.new(strict: true) p state.strict? # => true begin JSON.generate([Object.new], state) rescue JSON::GeneratorError => e p e.message # => "Object not allowed in JSON" end[SEE_ALSO]
JSON::State#as_json= - [PARAM]
to_h -> HashRuby 1.9.3 から[permalink][rdoc][edit]to_hash -> HashRuby 2.1.0 から-
自身をハッシュに変換します。
例require "json" require "pp" json_state = JSON::State.new pp json_state.to_h # => {:indent=>"", # :space=>"", # :space_before=>"", # :object_nl=>"", # :array_nl=>"", # :allow_nan=>false, # :ascii_only=>false, # :max_nesting=>100, # :depth=>0, # :buffer_initial_length=>1024}