Mam kod .NET
, który deserializuje obiekty JSON
utworzone przez webservice
z dynamicznym językiem. Ponieważ źródło jest dynamiczne, czasami szereguje wartości całkowe w formacie zmiennoprzecinkowym (na przykład 2 zserializowano do "2.0").Jak mogę przywrócić zachowanie deserializacji int po aktualizacji Json.NET?
Z Json.NET 4.0.4
, działało to płynnie (wydaje się, że zaokrąglanie było stosowane podczas deserializacji). Jednak po aktualizacji do Json.NET 4.5
przekształcenie wersji 2.0 powoduje obecnie wyświetlenie FormatException
. Oto kod:
// works as expected in both versions
var s = "2";
Console.WriteLine(JsonConvert.DeserializeObject<int>(s));
// throws FormatException in 4.5 only
var s = "2.0";
Console.WriteLine(JsonConvert.DeserializeObject<int>(s));
// throws FormatException in 4.5, rounds to 3 in 4.0.4
var s = "2.6";
Console.WriteLine(JsonConvert.DeserializeObject<int>(s));
Czy istnieje prosty sposób przywrócenia oryginalnego zachowania? Idealnym zachowaniem byłoby deserializowanie tylko liczb o wartościach integralnych, ale w dowolnym formacie (np. 2.0, 1e10, ale nie 2.5), ale zadowalałoby mnie zachowanie w wersji 4.0.4.
może trzeba rozważyć dodanie 'objectType == typeof (object) 'w' CanConvert', jeśli klasa docelowa "nie określa" rzeczywistego typu np 'class MyObject {identyfikator obiektu publicznego; } ' – drzaus
@drzaus Może, ale bądź ostrożny. Jeśli to zrobisz i będziesz miał inne właściwości typu 'object', które są * nie * liczbami, ten konwerter spróbuje je obsłużyć, co może nie być tym, czego się spodziewasz. Będziesz musiał dodać kod do obsługi tego przypadku. –
Ach tak, myślałem o niektórych [innych odpowiedziach] (http://stackoverflow.com/a/28748973/1037948), które obsługują to, sprawdzając 'JTokenType' i jeśli nie jest to typ oczekiwany, zamiast rzucać' FormatException' po prostu zwraca 'serializer.Deserialize (reader)', który wydaje się delegować go do tego, co jeszcze powinno poprawnie obsługiwać. Do tej pory działało to w moich testach z zagnieżdżonymi, złożonymi typami. – drzaus