2015-08-04 15 views
19

Ho il codice seguente:Come gestire i valori nulli/vuoti in JsonConvert.DeserializeObject

return (DataTable)JsonConvert.DeserializeObject(_data, (typeof(DataTable))); 

Poi, ho provato:

var jsonSettings = new JsonSerializerSettings 
{ 
    NullValueHandling = NullValueHandling.Ignore 
}; 

return (DataTable)JsonConvert.DeserializeObject<DataTable>(_data, jsonSettings); 

La linea di ritorno sta gettando l'errore:

{"Errore durante la conversione del valore \" \ "per digitare 'System.Double'."}

Un sacco di soluzioni online suggeriscono la creazione di Class personalizzati con tipi nullable, ma questo non funzionerà per me. Non posso aspettarmi che il JSON sia in un certo formato. Non ho controllo sul numero di colonne, sul tipo di colonna o sui nomi di colonna.

+0

usare un 'Dictionary'. –

+1

Forse dovresti usare LINQ su JSON invece di ottenere un 'JObject' invece di creare un' DataTable'? –

+0

Se è necessario convertire 'DataTable', utilizzare il convertitore dedicato [DataTableConverter] (https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Converters/DataTableConverter.cs#L25) – Candide

risposta

53

È possibile fornire le impostazioni per JsonConvert.DeserializeObject per dirgli come gestire i valori null, in questo caso, e molto altro ancora:

var settings = new JsonSerializerSettings 
        { 
         NullValueHandling = NullValueHandling.Ignore, 
         MissingMemberHandling = MissingMemberHandling.Ignore 
        }; 
var jsonModel = JsonConvert.DeserializeObject<Customer>(jsonString, settings); 
+0

Questa è la risposta perfetta - ho setacciato soluzioni e finalmente uno che funziona. Status di eroe. – iTrout

+0

Ha funzionato per me in questo codice: https://github.com/SpreadServe/SSAddin – osullivj

+0

incredibile, grazie! – Jeffh2170

1

È possibile sottoscrivere l'evento "Errore" e ignorare gli errori di serializzazione come richiesto.

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; 
    } 
+0

Ignora l'errore. Ma l'oggetto 'DataTable' restituito è nullo. – Kyle

+0

Puoi pubblicare la stringa JSON e quindi cambierò la mia risposta per adattarla meglio. – DotNetHitMan