2012-03-22 19 views
5

Por ejemplo, si tengoAl utilizar newtonsoft json.net para deserializar una cadena, ¿cómo convierto una cadena vacía en nulo para una int nullable?

public class MyClass 
{ 
    public Int32? Id { get;set; } 
    public string Description { get;set; } 
} 

y mi cadena JSON se parece a esto:

"{\"Id\":\"\",\"Description\":\"test\"}" 

me sale el error "No se puede convertir cadena a entero"

+3

Eso valores * es * una cadena, ¿no se puede arreglar el JSON? – svick

+0

Además, realmente funciona para mí, no me da ningún error. ¿Podría publicar el código exacto que reproduce su problema? ¿Y qué versión de JSON.NET estás usando? – svick

Respuesta

18

Como svick dijo, deberías arreglar tu Json. Sin embargo, si se trata de un Json externo sobre el que no tiene control, puede usar JsonConverter.

public class StringToNIntConverter : JsonConverter 
{ 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(int?); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.TokenType == JsonToken.Null) 
      return null; 
     if (reader.TokenType == JsonToken.Integer) 
      return reader.Value; 

     if (reader.TokenType == JsonToken.String) 
     { 
      if (string.IsNullOrEmpty((string)reader.Value)) 
       return null; 
      int num; 
      if (int.TryParse((string)reader.Value, out num)) 
       return num; 

      throw new JsonReaderException(string.Format("Expected integer, got {0}", reader.Value)); 
     } 
     throw new JsonReaderException(string.Format("Unexcepted token {0}", reader.TokenType)); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     writer.WriteValue(value); 
    } 
} 

public class MyClass 
{ 
    [JsonConverter(typeof(StringToNIntConverter))] 
    public Int32? Id { get; set; } 
    public string Description { get; set; } 
} 
+0

Volviendo a la versión 4.0.4 trabajado. Ahora permite pasar nulos para entradas anulables. Gracias a todos por sus respuestas. – user1286307

+3

+1 buen trabajo, salvó mi tocino! –

+0

Usando la versión 4.5 de Json.NET encontré que reader.Value estaba volviendo un largo, por lo tanto tuve que cambiar el lector de devolución. Valor; para devolver Convert.ToInt32 (reader.Value); – s1mm0t

Cuestiones relacionadas