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
View on GitHub
Install in Dash