データ形式・構造化データ
大きなIDの末尾が変わった。JSONの精度を確認したい
使うツール
注文番号をコピーしただけなのに、別の画面では末尾が一つ違う。大きなIDでは、計算していなくても、数値として読み込んだ時点で表せる精度の限界にぶつかることがあります。元のJSONに書かれていた桁と、プログラムが数値へ変換した後の値を同じものとして扱うと、どこで変わったのか分からなくなります。まずは架空の連番で、隣り合う二つの値を区別できるかを確認しましょう。
末尾が一つ違うIDを、同時に整形する
{"first":9007199254740992,"second":9007199254740993}JSON整形・検証へこのまま貼り付け、整形を実行します。SheepDevの整形処理は精度を保つパーサーを使うため、firstとsecondの末尾はそれぞれ2と3で残ります。確認するのは単にエラーが出ないことではなく、出力に二つの異なる数値が残っていることです。表示の途中を省略したラベルや、桁区切りした見た目ではなく、出力の文字列を確かめます。
同じデータを別のプログラムへ渡してから戻したとき、secondも2になっていたなら、その経路のどこかで情報を失っています。このツールで正しく整形できたことは、前後のアプリまで同じ精度で扱う保証ではありません。受信した生の本文、解析直後、画面表示、保存後の再読込を別々に比較すると、最初に変わった段階を見つけやすくなります。
計算しないIDは、文字列という選択肢がある
{"first":"9007199254740992","second":"9007199254740993","code":"00123"}この形では、長いIDも00123も文字列です。足し算の対象ではなく識別子として扱うなら、桁と先頭ゼロを守りやすい方法になります。ただし、送り手だけ文字列へ変えればよいわけではありません。受け取り側が数値型しか許可しない場合は入力エラーになるため、APIや保存先の契約を合わせる必要があります。表記を直す作業と型を変更する作業は分けて説明してください。
JSONの数値として00123と書くことは、先頭ゼロを持つIDの安全な表現にはなりません。文字列の00123を数値へ変換して123にした後で、元が何桁だったかを自動で復元することもできません。桁数が決まったコードなら、桁数そのものが仕様の一部です。大きさを比較する数値なのか、完全一致で照合するコードなのかを、最初に決めておきます。
桁の違いと型の違いを、別々に比較する
{"id":9007199254740993}
{"id":9007199254740992}JSON構造比較では、上の二行を一つの入力へまとめるのではなく、左と右へ一つずつ入れます。末尾が異なるidを変更として確認します。次に右側を文字列のIDへ変更し、値の型も異なる比較として読みます。精度保持の内部表現によって差分の詳細にvalueなどの補助的なパスが見える場合がありますが、内部表示をAPIの本来の項目名と混同しないでください。
数値の1と1.0のように、数学的な値は同じでも書き方が違う例もあります。構造比較がどの違いを表示するかは実装の比較方式に依存します。今回守りたいのが識別子の文字列そのものなら、数値として同じかどうかだけを合格条件にしないでください。固定した期待文字列との比較と、JSONとしての型の確認を併用すると、確認したい契約に近づけられます。
整形で保てても、次の変換で失うことがある
JSONをCSVへ出して表計算ソフトで開くとき、CSVに正しい桁が残っていても、開いた側が数値へ読み替えることがあります。また、JSON⇔TOMLなど別形式への変換には、整形とは異なる対応範囲があります。一つのツールが精度を保つからといって、別の変換にも同じ保証があるとは考えません。各段階の入力と出力を保存せずに確認したい場合も、まず架空の境界値を使います。
特に『いったん普通の数値へ変えてからBigIntへ戻す』方法では、失った末尾は戻りません。最初の読み込みで区別が消えた後は、どちらの元データだったかを出力だけから判断できないためです。復旧に必要なのは、丸められる前の元データです。画面上で末尾を手修正するより、どの入口で精度を守るかを決めて、同じ問題が再発しない受け渡しへ直します。
小さい正常値だけで、連携テストを終えない
テストには小さな123だけでなく、隣り合う大きな二つの値、文字列の大きなID、先頭ゼロのコードを入れます。数値として扱う仕様なら、その上限とエラーにすべき範囲も記録します。全部を文字列へ変換するのが常に正解ではなく、数量として計算するフィールドまで文字列へ変えると、別の型の不整合を作るからです。項目ごとの役割から選ぶ必要があります。
確認結果を共有するときは、元のJSON、選んだ操作、出力された値、期待していた型をセットにします。桁落ちという言葉だけでは、画面の省略表示なのか、保存値の変化なのかが伝わりません。元のデータが保たれていて表示だけが短いなら、データ変換の修正ではなく表示の確認になります。何を観測したかを具体的に残すことが、修正する場所を間違えない近道です。