Obtenir l'erreur "Impossible d'ajouter ou de supprimer des éléments de Newtonsoft.Json.Linq.JProperty" dans Json.net
Donc je suis en train de contrôle de la désérialisation par la lecture d'un objet json comme un JObject, la suppression de certains champs, puis la désérialisation de nouveau à mon objet cible à l'aide de Json.Net. Le problème est, à chaque fois que j'essaie de supprimer un champ, j'obtiens l'erreur:
Une exception non gérée du type 'Newtonsoft.Json.JsonException'
s'est produite dans Newtonsoft.Json.dllInformations supplémentaires: Impossible d'ajouter ou de supprimer des éléments de
Newtonsoft.Json.Linq.JProperty.
Voici mon (simplifié, mais encore la cause de l'erreur) code:
JToken token = (JToken)JsonConvert.DeserializeObject(File.ReadAllText(fileName));
foreach (JToken inner in token["docs"])
{
if (inner["_id"] != null)
inner["_id"].Remove();
MyObject read = new MyObject();
JsonConvert.PopulateObject(inner.ToString(), read);
Values.Add((MyObject)JsonConvert.DeserializeObject(inner.ToString(), typeof(MyObject)));
}
Le json est un fichier très volumineux, où les docs tableau contient de nombreux éléments comme suit (nouveau simplifié pour plus de clarté):
{
"docs": [
{
"Time": "None",
"Level": 1,
"_id": "10208"
},
{
"Time": "None",
"Level": 1,
"_id": "10209"
}
]
}
Sinon, si il ya une meilleure façon pour désérialiser JSON pour un type spécifique, mais encore ignorant des champs supplémentaires, ce qui serait une alternative idéale.
source d'informationauteur Miguel
Vous devez vous connecter pour publier un commentaire.
En supposant
Values
est unList<MyObject>
et votreMyObject
classe ressemble à ceci:vous pouvez remplacer ce code par le suivant pour obtenir le résultat que vous souhaitez:
Cela fonctionne parce que Json.Net ignore les propriétés manquantes par défaut. Depuis le
MyObject
classe ne contient pas de_id
propriété pour désérialiser, vous n'avez pas besoin de sauter à travers des cerceaux en essayant de la retirer de l'JSON.Explication de pourquoi
Remove()
ne fonctionne pasJToken.Remove()
supprime unJToken
de son parent. Il est légal pour supprimer unJProperty
de son parentJObject
ou de retirer un enfantJToken
à partir d'unJArray
. Cependant, vous ne pouvez pas supprimer la valeur à partir d'uneJProperty
. UnJProperty
doit toujours avoir exactement une valeur.Lorsque vous demandez
token["_id"]
vous obtenez de nouveau le valeur de laJProperty
appelé_id
pas laJProperty
lui-même. Par conséquent, vous obtiendrez un message d'erreur si vous essayez d'appelerRemove()
sur cette valeur. Pour le faire fonctionner de la manière que vous faites, vous devez faire ceci:Ce dit "Trouver le bien immobilier dont le nom est
_id
et de me donner de la valeur. Si elle existe, obtenir la valeur du parent (la propriété), et de l'enlever de son parent (le contenantJObject
)."Une autre façon de faire qui est peut-être un peu plus clair, c'est-à-dire ceci:
Basé sur brillian réponse de Brian, vous pouvez le faire simplement dans votre cas: