Tengo el siguiente código:
return (DataTable)JsonConvert.DeserializeObject(_data, (typeof(DataTable)));
Entonces, probé:
var jsonSettings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; return (DataTable)JsonConvert.DeserializeObject<DataTable>(_data, jsonSettings);
La línea de retorno arroja el error:
{"Error al convertir el valor \"\" para escribir 'System.Double'."}
Muchas soluciones en línea sugieren crear una Class
personalizada con tipos anulables, pero esto no funcionará para mí. No puedo esperar que el json esté en un formato determinado. No tengo control sobre el recuento de columnas, el tipo de columna o los nombres de las columnas.
Puede proporcionar configuraciones a JsonConvert.DeserializeObject
para indicarle cómo manejar valores nulos, en este caso, y mucho más:
var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, MissingMemberHandling = MissingMemberHandling.Ignore }; var jsonModel = JsonConvert.DeserializeObject<Customer>(jsonString, settings);
Una solución alternativa para Thomas Hagström, que es mi preferida, es usar el atributo de propiedad en las variables miembro.
Por ejemplo, cuando invocamos una API, puede o no devolver el mensaje de error, por lo que podemos establecer la propiedad NullValueHandling para ErrorMessage:
public class Response { public string Status; public string ErrorCode; [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] public string ErrorMessage; } var response = JsonConvert.DeserializeObject<Response>(data);
El beneficio de esto es aislar la definición de datos (qué) y la deserialización (uso), la deserialización no necesita preocuparse por la propiedad de los datos, de modo que dos personas puedan trabajar juntas, y la declaración de deserialización será limpia y simple.
Puede suscribirse al evento 'Error' e ignorar los errores de serialización según sea necesario.
static void Main(string[] args) { var a = JsonConvert.DeserializeObject<DataTable>("-- JSON STRING --", new JsonSerializerSettings { Error = HandleDeserializationError }); } public static void HandleDeserializationError(object sender, ErrorEventArgs errorArgs) { var currentError = errorArgs.ErrorContext.Error.Message; errorArgs.ErrorContext.Handled = true; }