c# json json.net

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