6.80. kink/json/JSON

JSON文字列とJSON値の間で変換を行う。JSON値についてはkink/json/JSON_VALモジュールを見よう。

このモジュールは、[RFC 8259]で仕様化されたJSONをサポートする。

[RFC 8259] https://tools.ietf.org/html/rfc8259

6.80.1. JSON.parse(Json ...[$config={}])

parseは、str値Jsonから、JSON値をデコードする。

コンフィグメソッド:

• C.allow_unpaired_surrogates

• C.on_success($success): default = VAL$identity

• C.on_error($error): default = 例外を投げる関数

Jsonが妥当なJSON文字列である場合、parseは、デコードされたJSON値を引数として$successを末尾呼び出しする。

Jsonが妥当なJSON文字列でない場合、parseは、(Msg, Pos)を引数として$errorを末尾呼び出しする。ただし、Msgはエラーメッセージのstr値であり、PosはJson中でエラーが見つかった場所の位置添字である。

数値のScale

結果のJSON値中の数値のScaleは、JSON中の数値を表現できる最小の非負の値に正規化される。例:

:JSON.require_from('kink/json/')

stdout.print_line(JSON.parse('42.000').repr)  # => 42
stdout.print_line(JSON.parse('1.23e+5').repr) # => 12300

対にならないサロゲートコードポイント

デフォルトでparseは、オブジェクトのメンバの名前、および文字列値の中における、対にならないサロゲートコードポイントをエラーとして扱う。そのようなコードポイントが見つかったら、parseは$errorを末尾呼び出しする。

C.allow_unpaired_surrogatesが呼ばれたら、parseは対にならないサロゲートコードポイントを許容する。JSON値がどのように構成されるかは、ランタイム依存である。コードポイントは削除されるかもしれないし、str値中に残るかもしれない。

事前条件

Jsonはstr値でなければならない。

$successはJSON値を取る関数でなければならない。

$errorは(Msg, Pos)を取る関数でなければならない。ただし、Msgはstr値であり、Posは整数のnum値である。

:JSON.require_from('kink/json/')

stdout.print_line(JSON.parse('{"name": "Hakuho", "birthyear": 1985}').repr)
# => (flat_map "birthyear"=>1985 "name"=>"Hakuho")

:analyze_json <- {(:Json)
  JSON.parse(Json){(:P)
    P.on_success{(:Val)
      'parsed as {}'.format(Val.repr)
    }
    P.on_error{(:Msg :Pos)
      'error: {} at {}'.format(Msg Pos)
    }
  }
}

stdout.print_line(analyze_json('42'))
# => parsed as 42

stdout.print_line(analyze_json('broken!'))
# => error: unexpected character at 0

6.80.2. JSON.stringify(Json_val ...[$config={}])

stringifyは、Json_valを、JSONのstr値に変換する。

コンフィグメソッド:

• C.pretty(...[Indent = ふたつの空白文字]): pretty-printモードを有効化する。

• C.after_colon(After_colon): default = pretty-printモードのときは空白文字、それ以外は空のstr値。

• C.after_comma(After_comma): default = 空のstr値。

書式

pretty-printモードが有効でないとき、JSONは単一行に出力される。

pretty-printモードが有効なとき、オブジェクトと配列のエントリごとに改行文字が挿入される。エントリは、ひとつのネストごとに、Indentでインデントされる。

オブジェクトのエントリのコロン `:` のあとには、After_colonが挿入される。

pretty-printモードが有効でない場合、オブジェクトと配列のエントリのあとのコンマ `,` のあとには、After_commaが挿入される。

事前条件

Json_valはJSON値でなければならない。

Indentは、空白文字とタブのみからなるstr値でなければならない。

After_colonは、空白文字とタブのみからなるstr値でなければならない。

After_commaは、空白文字とタブのみからなるstr値でなければならない。

:JSON.require_from('kink/json/')
:FLAT_MAP.require_from('kink/container/')

:Json_val <- FLAT_MAP.of('nums' [1 2 3])

stdout.print_line(JSON.stringify(Json_val))
# Output:
#   {"nums":[1,2,3]}

stdout.print_line(
  JSON.stringify(Json_val){(:C)
    C.pretty
  }
)
# Output:
#   {
#     "nums": [
#       1,
#       2,
#       3
#     ]
#   }