2013-07-25 21 views
9

Ho riscontrato un problema strano utilizzando WebAPI e JSON.Net. Quando decodificando JSON che è stato inviato alla mia API, mi sembra che stia perdendo la precisione! Sto inviando il decimale a 3 cifre decimali, ma quando i valori si materializzano nel mio oggetto è solo a 2 cifre decimali!WebAPI, JSON.Net e perdita della precisione decimale

Il JSON presento assomiglia a questo:

{ 
    id: 1, 
    name: 'mock data', 
    value: 123.456 
} 

Questo è destinato ad una classe che sembra qualcosa di simile:

public class MockObject { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public decimal Value { get; set; } 
} 

Solo per completezza questo è fondamentalmente ciò che il mio metodo WebAPI assomiglia :

public HttpResponseMessage Post (MockObject data) { 
    // do something with the value here and return the relevant response 
} 

sto trasmettendo i dati attraverso una richiesta ajax JQuery, ma posso vedere la postato i valori sono esattamente come mi aspetto quando ispeziono i valori negli strumenti di chrome dev prima di inviarli e in fiddler dopo che sono passati "over the wire".

Quando si ottiene qualcosa con l'oggetto materializzato nel metodo Post, il valore di "Valore" è 123.45.

Se invio 2 o meno cifre decimali (ad esempio 123.4 o 123.45) il valore viene de-serializzato come previsto, tuttavia se invio più di 2 posizioni decimali (ad esempio 123.456 o 123.4567 ecc., Il valore viene sempre deserializzato a 123.45.

Chiunque altrimenti incontrato questo problema? Eventuali suggerimenti?

risposta

16

sono riuscito a risolvere la questione.

alla fine il problema è stato causato dal fatto che la cultura è stato impostato che contiene la formattazione del numero di valuta Il formato del numero di valuta specifica il numero di cifre decimali che s deve essere usato per valori decimali.

Per correggere questo ora impostare la lingua serializzatore WebAPI JSON a una nuova istanza di CultureInfo.InvariantCulture in Global.ascx.cs in questo modo:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Culture = new CultureInfo(string.Empty) { 
    NumberFormat = new NumberFormatInfo { 
     CurrencyDecimalDigits = 5 
    } 
}; 

Ciò significa che i valori decimali possono avere nulla fino a 5 cifre decimali.

Problemi correlati