Best practice per valori numerici JSON potenzialmente grandi

2

Ho sollevato questo problema sul progetto github per RazorJam.Insightly , dove come puoi vedere scopre che si sta verificando un errore perché per gli elementi specifici che sto recuperando e deserializzando da JSON in un oggetto, il valore ADDRESS_ID è troppo grande per rientrare in un int .

Inizialmente desideravo inviare una richiesta di modifica che modificasse tutti i campi Id che ho trovato per digitare string o long , ma non ero sicuro di quale sarebbe il migliore.

Poi c'è anche la possibilità di controllare prima la lunghezza e poi assegnarla in base all'opportunità o meno di adattarsi a Int32 , ma forse questa non è l'opzione migliore in quanto aggiunge più codice e probabilmente influisce sulle prestazioni.

Tuttavia, poiché altre persone potrebbero utilizzare questo codice, la modifica del tipo potrebbe interrompere i loro progetti se si basano su un valore di int , quindi forse il controllo è l'opzione migliore?

Ovviamente posso solo salvare una copia locale e apportare qualsiasi modifica voglia, ma sembra che sia meglio avere una versione pubblica che funzioni per tutti.

Illustrazione semplice

Implementazione corrente

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

Opzione 1

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

o

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

Opzione 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; } }
}

Qualcuno ha qualche pensiero o consiglio su cui possono condividere questo? Qualsiasi aiuto è molto apprezzato e scusa se questo è il forum sbagliato per questo!

    
posta Bassie 20.07.2017 - 04:46
fonte

1 risposta

1

String è l'opzione più sicura per tradurre i numeri avanti e indietro da Json e C #. JSON ha limitazioni sulla precisione che possono causare problemi su numeri interi di grandi dimensioni. Secondo la specifica JSON , le implementazioni dovrebbero limitare la precisione a quella di un numero a doppia precisione (64 bit). Ad esempio il numero lungo 767946224062369796 che può essere rappresentato esattamente da un C # long , non può essere rappresentato come un numero in virgola mobile a precisione doppia e può essere analizzato come 767946224062369792 dai decodificatori JSON. Per gli identificatori la precisione è della massima importanza, quindi ti consiglierei di consigliare loro di utilizzare un identificatore string .

Potresti utilizzare un BigInteger , ma dal momento che è un ID e non è utilizzato in matematica, non ci sono molti motivi per

Come hai detto, questo cambierà radicalmente, quindi potrebbero decidere di non farlo, oppure potrebbe dover attendere fino alla prossima versione principale.

    
risposta data 20.07.2017 - 05:27
fonte

Leggi altre domande sui tag