J'ai un JObject
qui est utilisé comme modèle pour appeler les services Web RESTful. Ce JObject
est créé via un analyseur et comme il est utilisé comme un modèle indiquant à l'utilisateur à quoi ressemble le schéma de point de terminaison, j'ai dû trouver un moyen de conserver toutes les propriétés, c'est pourquoi je leur donne null
par défaut. Comme à titre d'exemple, voici ce que l'objet ressemble à l'origine comme:JSON.NET sérialiser JObject tout en ignorant les propriétés nulles
{
"Foo":{
"P1":null,
"P2":null,
"P3":null,
"P4":{
"P1":null,
"P2":null,
"P3":null,
},
"FooArray":[
{
"F1":null,
"F2":null,
"F3":null,
}
]
},
"Bar":null
}
L'utilisateur est alors en mesure de remplir les champs individuels dont ils ont besoin, comme Foo.P2
et Foo.P4.P1
:
{
"Foo":{
"P1":null,
"P2":"hello world",
"P3":null,
"P4":{
"P1":1,
"P2":null,
"P3":null,
},
"FooArray":[
{
"F1":null,
"F2":null,
"F3":null,
}
]
},
"Bar":null
}
ce qui signifie qu'ils ne se soucient de ces deux domaines. Maintenant, je veux sérialiser ce modèle (JObject
) en une chaîne JSON, mais je veux seulement que les champs qui sont remplis apparaissent. J'ai donc essayé ceci:
string json = JsonConvert.SerializeObject(template,
new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
});
Malheureusement, cela n'a pas fonctionné. Je suis tombé sur this question et j'ai réalisé qu'une valeur null
dans l'objet est un type réel JToken
et pas vraiment un null
, ce qui est logique. Cependant, dans ce cas très particulier, je dois pouvoir me débarrasser de ces champs "inutilisés". J'ai essayé d'itérer manuellement sur les noeuds et de les supprimer, mais cela n'a pas fonctionné non plus. Notez que le seul type géré que j'utilise est JObject
; Je n'ai pas de modèle pour convertir l'objet ou définir des attributs, car ce "modèle" est résolu lors de l'exécution. Je me demandais juste si quelqu'un a rencontré un problème comme celui-ci et a des idées. Toute aide est grandement appréciée!
Merci! Je suis venu avec un algorithme presque similaire peu après avoir posté la question mais votre réponse est toujours valide :) – PoweredByOrange
Aucun problème; heureux d'avoir pu aider. –
J'étais coincé en essayant d'y parvenir, merci pour votre contribution, ça marche! –