c# - Json.NET, no se puede serializar el tipo de nullable
(4)
El error le está diciendo que no puede encontrar un constructor que pueda usar para la deserialización.
Intenta agregar un constructor predeterminado a la clase:
public class MyObject
{
public int? integerValue { get; set; }
public DateTime? dateTimeValue { get; set; }
public MyObject(){}
}
Patricio.
--EDITAR--
Así que acabo de crear una aplicación de consola simple usando MyObject, con y sin un constructor predeterminado y no obtengo errores. Aquí está mi ejemplo:
class Program
{
static void Main(string[] args)
{
var mo = new MyObject { integerValue = null, dateTimeValue = null };
var ser = Newtonsoft.Json.JsonConvert.SerializeObject(mo);
var deser = Newtonsoft.Json.JsonConvert.DeserializeObject(ser, typeof(MyObject));
}
}
public class MyObject
{
public int? integerValue { get; set; }
public DateTime? dateTimeValue { get; set; }
}
No tengo excepciones ...
¿Puede mostrar un ejemplo del JSON que está intentando deserializar?
Estoy tratando de convertir JSON a C # objeto utilizando Json.NET. El objeto se ve así en C #:
public class MyObject
{
public int? integerValue {get;set;}
public DateTime? dateTimeValue {get;set;}
}
Pero cuando ejecuto JsonConvert.DeserializeObject()
en el JSON entrante, obtengo la siguiente excepción:
No se puede encontrar un constructor para usar para el tipo System.Nullable`1 [System.Int32]. Una clase debe tener un constructor predeterminado o solo un constructor con argumentos.
--- EDITAR ----
Bueno, resulta que después de hacer muchas pruebas, el problema se reduce a que mi aporte para mi JSON fue así:
{integerValue:{}, dateTimeValue: {} }
en lugar de:
{integerValue: null, dateTimeValue: null}
Resulta que {} es una forma válida de representar un objeto nulo en JSON, pero el analizador JSON.Net no sabía cómo tratar los tokens {} de la misma manera que ''nulo'' cuando se des-serializa.
¡Gracias a todos por sus comentarios!
La solución para mí fue crear un convertidor de acuerdo con esta respuesta.
public class BoolConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(((bool)value) ? 1 : 0);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.Value == null || reader.Value.ToString() == "False")
{
return false;
}
return true;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(bool);
}
}
Y que especificar en modelo.
[JsonConverter(typeof(BoolConverter))]
public Boolean bold;
No sé si es la respuesta correcta o no, pero al menos puede crear un convertidor personalizado para Nullable <>, me ayuda mucho con la serialización / deserialización de DataRow que tampoco tiene un constructor predeterminado. Aquí está la sample
Una versión completa de la respuesta de @Patrick:
static void Main(string[] args)
{
var mo = new MyObject ();
var ser = Newtonsoft.Json.JsonConvert.SerializeObject(mo);
var myStr = "{}";
var myStr1 = "{tITi: 10}";
var myStr2 = "{integerValue: 10}";
var deser0 = Newtonsoft.Json.JsonConvert.DeserializeObject(ser, typeof(MyObject));
var deser1 = Newtonsoft.Json.JsonConvert.DeserializeObject(myStr, typeof(MyObject));
var deser2 = Newtonsoft.Json.JsonConvert.DeserializeObject(myStr1, typeof(MyObject));
var deser3 = Newtonsoft.Json.JsonConvert.DeserializeObject(myStr2, typeof(MyObject));
}
public class MyObject
{
public int? integerValue { get; set; }
public DateTime? dateTimeValue { get; set; }
public int toto { get; set; } = 5;
public int Titi;
}
Salida:
?deser0
{ConsoleApplication1.MyObject}
Titi: 0
dateTimeValue: null
integerValue: null
toto: 5
?deser1
{ConsoleApplication1.MyObject}
Titi: 0
dateTimeValue: null
integerValue: null
toto: 5
?deser2
{ConsoleApplication1.MyObject}
Titi: 10
dateTimeValue: null
integerValue: null
toto: 5
?deser3
{ConsoleApplication1.MyObject}
Titi: 0
dateTimeValue: null
integerValue: 10
toto: 5