2013-07-25 8 views
9

Znalazłem trochę dziwnego problemu przy użyciu WebAPI i JSON.Net. Po odseparowaniu JSON, który został zgłoszony do mojego interfejsu API, tracę precyzję! Przesyłam dziesiętny do 3 miejsc po przecinku, ale kiedy wartości materializują się w moim obiekcie, to tylko do 2 miejsc po przecinku!WebAPI, JSON.Net i utrata dokładności dziesiętnej

JSON przesłać wygląda następująco:

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

ten jest związany z klasy, który wygląda mniej więcej tak:

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

Tylko dla kompletności Jest to w zasadzie to, co moja metoda WebAPI wygląda :

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

Przesyłam dane za pomocą żądania ajax JQuery, ale widzę opublikowane wartości są dokładnie takie, jakich oczekuję podczas sprawdzania wartości w narzędziach Chrome przed przesłaniem i w skrzypcach, gdy już przejdą "przez przewód".

Kiedy robi się coś z materializowanym obiektem w metodzie Post, wartość "Wartość" wynosi 123,45.

Jeśli prześlę 2 lub mniej miejsc po przecinku (tj. 123,4 lub 123,45), wartość zostanie zdekseralizowana zgodnie z oczekiwaniami, jednak jeśli prześlę więcej niż 2 miejsca po przecinku (tj. 123.456 lub 123.4567 itd., Wartość zawsze będzie rozserializowana do 123,45.

Ktoś jeszcze natknąć się ten problem? Wszelkie sugestie?

Odpowiedz

16

udało mi się to rozwiązać.

W końcu problem był spowodowany tym, że kultura była ustawiona który zawiera formatowanie numeru waluty. Format numeru waluty określa liczbę miejsc po przecinku powinien być użyty dla wartości dziesiętnych.

Aby rozwiązać ten problem teraz ustawić serializer kulturę WebAPI JSON do nowej instancji CultureInfo.InvariantCulture w Global.ascx.cs tak:

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

Oznacza to, że wartości dziesiętne może mieć nic aż do 5 miejsc po przecinku.

Powiązane problemy