2012-03-28 4 views
5

Gibt es eine Möglichkeit, das standardmäßige Deserialisierungsverhalten von Json.net beim Umgang mit primitiven Typen zu überschreiben? Zum Beispiel, wenn das Deserialisieren json Array [3.14,10,"test"] auf eine Art von object[]3,14 wird der Typ sein double und 10 wird vom Typ long. Kann ich diese Typentscheidungen trotzdem abfangen oder überschreiben, sodass ich die Werte als decimal bzw. int deserialisieren kann?Überschreiben der standardmäßigen primitiven Typbehandlung in Json.Net

Ich möchte grundsätzlich immer json Ganzzahlen als int zurückgeben und schwebt, um als decimal zurückzukehren. Dies wird mir ersparen einige double zu decimal Konvertierungen in meinem Code zu injizieren.

Ich habe in Erweiterung Newtonsoft.Json.Serialization.DefaultContractResolver untersucht und meine eigene Newtonsoft.Json.JsonConverter implementieren, aber ich habe keine Möglichkeit gefunden, diese gewünschte Überschreibung zu implementieren.

Beispiel-Code zu reproduzieren

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} 

Antwort

1

Ich denke, sollte diese Arbeit

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 nicht als virtuelle in meiner Freilassung von json.net 4.5.1, so dass die Überschreibung gekennzeichnet wirft eine "keine geeignete Methode zum Überschreiben". Fehle ich etwas? –

+0

@MatthewRuston Meine aktuelle Json.Net Version ist '4.0.5'. –

+0

sieht so aus, als hätten sie die virtuelle Eigenschaft in einer kürzlich veröffentlichten Version entfernt. Seltsam. –