2015-08-04 12 views
19

Mam następujący kod:Jak obsługiwać/null pustych wartości w JsonConvert.DeserializeObject

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

Następnie próbowałem:

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

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

Linia powrotu rzuca błąd:

{"Błąd podczas konwersji wartości \" \ "na typ" System.Double ".}}

Wiele rozwiązań online sugerujących tworzenie niestandardowych Class z typami zerowymi, ale to nie będzie działać dla mnie. Nie mogę oczekiwać, że json będzie w określonym formacie. Nie mam wpływu na liczbę kolumn, typ kolumny ani nazwy kolumn.

+0

użyć 'Dictionary'. –

+1

Być może powinieneś zamiast tego użyć LINQ do JSON i uzyskać 'JObject' zamiast tworzyć' DataTable'? –

+0

Jeśli chcesz przekonwertować 'DataTable' użyj dedykowanego konwertera [DataTableConverter] (https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Converters/DataTableConverter.cs#25) – Candide

Odpowiedz

53

Można dostarczyć ustawienia do JsonConvert.DeserializeObject, aby poinformować go, jak obsługiwać wartości null, w tym przypadku, i wiele więcej:

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

To jest idealna odpowiedź - szukałem rozwiązań, a na końcu tego, który działa. Status bohatera. – iTrout

+0

Pracował dla mnie w tym kodzie: https://github.com/SpreadServe/SSAddin – osullivj

+0

niesamowite, dziękuję! – Jeffh2170

1

Możesz zasubskrybować zdarzenie "Błąd" i zignorować błąd (e) serializacji zgodnie z wymaganiami.

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

To ignoruje błąd w porządku. Ale zwracany obiekt 'DataTable' ma wartość NULL. – Kyle

+0

Czy możesz opublikować ciąg JSON, a następnie zmieni moją odpowiedź na lepszy kolor. – DotNetHitMan

Powiązane problemy