2015-03-25 3 views
5

Sto provando a serializzare un oggetto usando Newtonsoft Json.Net.Newtonsoft Json.Net serializza JObject non ignora i valori nulli, anche con le giuste impostazioni

Questo oggetto è un tipo anonimo pieno di molte cose eterogenee, principalmente POCO regolari, ma anche alcuni JObject s o JArray s.

Il fatto è che quando si aggiunge la proprietà NullValueHandling a NullValueHandling.Ignore, ogni proprietà nullo viene ignorata, ma solo se fa parte di un oggetto "normale" .Net. Ogni proprietà null all'interno di JObject o JArray rimane.

Ecco un esempio minimo:

var jobj = JObject.FromObject(new Anything{ 
    x = 1, 
    y = "bla", 
    z = null 
}); 

var poco = new Foo { 
    foo1 = "bar", 
    foo2 = null 
}; 

var serialized = JsonConvert.SerializeObject(new { 
    source1 = poco, 
    source2 = jobj 
}, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore}); 

C'è un modo semplice per ignorare quei valori nulli come bene? Ho perso qualche opzione di impostazione? O devo affrontarlo manualmente?

+3

Sarebbe di grande aiuto se si potesse fornire un programma breve ma completo che dimostra il problema. –

+1

Una voce 'null' saltata di un array cambierebbe gli indici; in questo caso è necessario gestirlo manualmente. –

+1

Questo codice non può essere compilato perché 1) non esiste il tipo Foo (no, questo non è nitpicking perché il problema potrebbe potenzialmente essere nella definizione di quel tipo in qualche modo), e 2) Non è possibile assegnare il letterale null a un proprietà di tipo anonimo. – erikkallen

risposta

15

Un valore "null" in JObject è in realtà un non nullo JValue con JValue.Type pari a JTokenType.Null. Rappresenta un valore JSON di null quando tale valore appare effettivamente nel JSON. Credo esiste per catturare la differenza tra i seguenti due oggetti JSON:

"source2": { 
    "z": null 
    } 

    "source2": { 
    } 

Nel primo caso, la proprietà "z" è presente con un valore null JSON. Nel secondo caso, la proprietà "z" non è presente. Linq-to-JSON rappresenta il primo caso con un tipo nullo JValue anziché JProperty.Value in realtà essere nullo.

Per evitare gettoni nulli da strisciante in valori d' tuoi JObject, utilizzare l'impostazione serializzatore appropriata durante la creazione del JObject:

 var jobj = JObject.FromObject(new 
     { 
      x = 1, 
      y = "bla", 
      z = (int?)null 
     }, new JsonSerializer { NullValueHandling = NullValueHandling.Ignore }); 
+1

Così semplice. Molte grazie! –

+0

Questo non funziona quando l'oggetto anonimo ha una proprietà di Array, che ha oggetti con proprietà null, in pratica, questo ** non ** controlla in modo ricorsivo. – Fwd079

+0

@ Fwd079 - controlla in modo ricorsivo, ma l'impostazione non si applica alle voci della raccolta. Da [docs] (http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_NullValueHandling.htm): * Ignora: ignora i valori nulli durante la serializzazione e deserializzazione di ** oggetti **. * Per saltare voci di raccolta specifiche, vedere forse [Esclusione di elementi specifici in una raccolta durante la serializzazione su JSON] (https://stackoverflow.com/questions/20955722) o [Serializzazione e raccolte del contratto personalizzato JSON.Net] (https://stackoverflow.com/questions/38038793) – dbc