2012-03-28 12 views
5

Czy istnieje sposób na przesłonięcie domyślnego zachowania deserializacji Json.net podczas obsługi typów pierwotnych? Na przykład, gdy deserializacji tablicy json [3.14,10,"test"] do rodzaju object[]3,14 będzie typu double i będzie typu long. Czy mimo to mogę przechwycić lub zmienić tę decyzję, aby móc odpowiednio przekształcić wartości na odpowiednio decimal i int?Zastępowanie domyślnej obsługi typów pierwotnych w Json.Net

W zasadzie zawsze chcę, aby liczba całkowita json zawsze zwracała się jako int i wyświetlała się jako decimal. Pozwoli mi to zaoszczędzić trochę czasu na wstrzyknięciu double do decimal konwersji w moim kodzie.

Szukałem rozszerzenia Newtonsoft.Json.Serialization.DefaultContractResolver i wdrożenia własnego Newtonsoft.Json.JsonConverter, ale nie odkryłem żadnego sposobu na wdrożenie tego pożądanego nadpisania.

Przykład kodu do odtworzenia

object[] variousTypes = new object[] {3.14m, 10, "test"}; 
string jsonString = JsonConvert.SerializeObject(variousTypes); 
object[] asObjectArray = JsonConvert.DeserializeObject<object[]>(jsonString); // Contains object {double}, object {long}, object {string} 

Odpowiedz

1

myślę, że powinno to działać

public class MyReader : JsonTextReader 
{ 
    public MyReader(string s) : base(new StringReader(s)) 
    { 
    } 

    protected override void SetToken(JsonToken newToken, object value) 
    { 
     object retObj = value; 
     if (retObj is long) retObj = Convert.ChangeType(retObj, typeof(int)); 
     if (retObj is double) retObj = Convert.ChangeType(retObj, typeof(decimal)); 

     base.SetToken(newToken, retObj); 
    } 
} 


object[] variousTypes = new object[] { 3.14m, 10, "test" }; 
string jsonString = JsonConvert.SerializeObject(variousTypes); 

JsonSerializer serializer = new JsonSerializer(); 
var asObjectArray = serializer.Deserialize<object[]>(new MyReader(jsonString)); 
+0

JsonTextReader.SetToken nie jest oznaczony jako wirtualny w moim wydaniu Json.NET 4.5.1, więc nadpisanie rzuca "nie nadaje się do zastąpienia". Czy czegoś brakuje? –

+0

@MatthewRuston Moja aktualna wersja Json.Net to '4.0.5'. –

+0

Wygląda na to, że usunęli wirtualną właściwość w najnowszej wersji. Dziwne. –

Powiązane problemy