2012-03-28 17 views
5

Esiste un modo per sovrascrivere il comportamento di deserializzazione predefinito di Json.net quando si gestiscono tipi primitivi? Ad esempio quando la deserializzazione l'array json [3.14,10,"test"] ad un tipo di object[]3.14 sarà di tipo double e sarà di tipo long. Posso comunque intercettare o ignorare questo tipo di decisione in modo da poter deserializzare i valori come decimal e int rispettivamente?Ignora la gestione di tipo primitivo predefinita in Json.Net

Fondamentalmente voglio sempre interi json restituire sempre come int e float per restituire come decimal. Questo mi farà risparmiare un po 'di dover iniettare double in decimal conversioni nel mio codice.

Ho cercato di estendere Newtonsoft.Json.Serialization.DefaultContractResolver e di implementare il mio Newtonsoft.Json.JsonConverter ma non ho ancora scoperto alcun modo per implementare questa sovrascrittura desiderata. Codice

Esempio di riprodurre

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} 

risposta

1

penso, questo dovrebbe funzionare

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 non è contrassegnato come virtuale nel mio rilascio di json.net 4.5.1, così l'override sta lanciando un "metodo non adatto per l'override". Mi sto perdendo qualcosa? –

+0

@MatthewRuston La mia attuale versione di Json.Net è '4.0.5'. –

+0

sembra che abbiano rimosso la proprietà virtuale in una versione recente. Strano. –

Problemi correlati