JSONValue

public enum JSONValue : Sendable, Equatable
extension JSONValue: Encodable
extension JSONValue: Decodable

JSON の値を表す値型です。

接続設定の snapshot と RPC のエラー詳細が、Encodable の値や JSONSerialization が返した 値をそのまま保持しないようにするために使います。Sendable な値だけで構成されるため、 actor / Task 境界を越えて受け渡せます。

数値の復元は変換の経路で変わります。init(from:) は Decimal を Double より先に判定する ため JSON の数値トークンの精度を保ちます。JSONSerialization を通る経路 (RPCErrorDetail.data など) は NSNumber を経由するため、小数は Double の値が Decimal として入ります (実測では 0.1 が .decimal(0.10000000000000001) になります)。 Decimal が表現できる範囲を超える指数の値 (1e300 など) だけが .double になります。

Equatable は case 込みで比較するため、.decimal(1) と .double(1.0) は等しくありません。 encode(to:) した値を init(from:) で戻すと .double(1.0) は .decimal(1) になるため、 encode と decode は対称ではありません。NaN (.decimal(Decimal.nan) / .double(.nan)) は 自分自身とも等しくなりません。

  • null

    Declaration

    Swift

    case null
  • bool

    Declaration

    Swift

    case bool(Bool)
  • 整数または小数

    整数トークンも Decimal として読むため、Int64 / UInt64 の case は持ちません。 (Decimal は 38 桁の仮数を持ち、UInt64.max の 20 桁を含みます)。

    Declaration

    Swift

    case decimal(Decimal)
  • Decimal が表現できる範囲を超える指数の値です。

    Declaration

    Swift

    case double(Double)
  • 文字列

    Declaration

    Swift

    case string(String)
  • 配列

    Declaration

    Swift

    case array([JSONValue])
  • 辞書

    Declaration

    Swift

    case object([String : JSONValue])
  • singleValueContainer へ書きます。

    keyedContainer を作ると SignalingConnect.encode(to:) の superEncoder と 二重のコンテナになり "metadata": {"metadata": ...} のようになるため、 singleValueContainer を使います。

    Declaration

    Swift

    public func encode(to encoder: Encoder) throws
  • JSON のトークンを JSONValue へ読み込みます。

    Double より先に Decimal を試すことで数値トークンの精度を保ちます。 Decimal が表現できない指数の値は Double へ落ちます。

    Declaration

    Swift

    public init(from decoder: Decoder) throws