2012-03-28 20 views
5

¿Existe alguna manera de anular el comportamiento de deserialización predeterminado de Json.net cuando se manejan tipos primitivos? Por ejemplo, cuando deserializar la matriz json [3.14,10,"test"] a un tipo de object[]3,14 será de tipo double y será de tipo long. ¿Hay alguna manera de que pueda interceptar o anular esta decisión de tipo para poder deserializar los valores como decimal y int, respectivamente?Anulación del manejo predeterminado de tipo primitivo en Json.Net

Básicamente siempre quiero enteros json para siempre devolver como int y flotantes para devolver como decimal. Esto me ahorrará tener que inyectar double a decimal conversiones en mi código.

He buscado ampliar Newtonsoft.Json.Serialization.DefaultContractResolver e implementar mi propio Newtonsoft.Json.JsonConverter pero no he descubierto ninguna forma de implementar esta anulación deseada. código

Ejemplo de reproducir

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} 

Respuesta

1

pienso, esto debería funcionar

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 no está marcado como virtual en mi liberación de json.net 4.5.1, por lo que la anulación está lanzando un 'método no apropiado para anular'. ¿Me estoy perdiendo de algo? –

+0

@MatthewRuston Mi versión actual de Json.Net es '4.0.5'. –

+0

parece que eliminaron la propiedad virtual en una versión reciente. Extraño. –

Cuestiones relacionadas