web-dev-qa-db-ja.com

潜在的に大きいJSON数値のベストプラクティス

RazorJam.Insightlyのgithubプロジェクトで この問題 を提起しました。ご覧のように、取得している特定のアイテムのためにエラーが発生していることがわかります。 JSONからオブジェクトに逆シリアル化すると、ADDRESS_IDの値が大きすぎてintに収まりません。

最初に、見つけたすべてのIdフィールドをstringまたはlongに修正する変更リクエストを送信したかったのですが、どちらが最適かわかりませんでした。

次に、最初に長さを確認してから、それがInt32に収まるかどうかに基づいて割り当てる可能性もありますが、コードを追加してパフォーマンスに影響を与える可能性があるため、これはおそらく最良のオプションではありません。

ただし、他のユーザーがこのコードを使用している可能性があるため、intの値に依存している場合、タイプを変更するとプロジェクトが壊れる可能性があるため、チェックが最善のオプションでしょうか?

もちろん、ローカルコピーを保存して必要な変更を加えることもできますが、すべての人に役立つパブリックバージョンを用意するのが最善のようです。

シンプルなイラスト

現在の実装

[JsonProperty(PropertyName = "ADDRESS_ID", NullValueHandling = NullValueHandling.Ignore)]
public int Id { get; set; }

オプション1

[JsonProperty(PropertyName = "ADDRESS_ID", NullValueHandling = NullValueHandling.Ignore)]
public string Id { get; set; }

OR

[JsonProperty(PropertyName = "ADDRESS_ID", NullValueHandling = NullValueHandling.Ignore)]
public long Id { get; set; }

オプション2

private object _id;

[JsonProperty(PropertyName = "ADDRESS_ID", NullValueHandling = NullValueHandling.Ignore)]
public object Id
{
    get { return _id; }
    set { _id = (long)value > int.MaxValue ? (long)value : (int)value; } }
}

誰かがこれについて共有できる考えやアドバイスはありますか?どんな助けでも大歓迎です、そしてこれがこれのための間違ったフォーラムであるならば謝罪してください!

2
Bassie

文字列は、JsonおよびC#との間で数値を相互に変換するための最も安全なオプションです。 JSONには精度に関する制限があり、大きな整数で問題が発生する可能性があります。 JSON仕様 によると、実装は精度を倍精度(64ビット)数の精度に制限する必要があります。たとえば、C#longで正確に表すことができる長い数値767946224062369796は、倍精度浮動小数点数として表すことができず、JSONデコーダーによって767946224062369792として解析される場合があります。識別子については、精度が最も重要なので、string識別子を使用することをお勧めします。

BigInteger を使用することもできますが、これはIDであり、数学では使用されないため、それほど多くの理由はありません。

あなたが言ったように、これは重大な変更になるので、彼らはそれをしないことを決定するかもしれません、またはそれは次のメジャーバージョンまで待つ必要があるかもしれません。

2
Samuel