Est-il possible d'ignorer obtenir uniquement des propriétés dans Json.NET sans l'aide de JsonIgnore attributs?
Est-il un moyen de les ignorer, uniquement en utilisant les propriétés de la Json.NET sérialiseur mais sans l'aide de JsonIgnore
attributs?
Par exemple, j'ai une classe avec ces propriétés:
public Keys Hotkey { get; set; }
public Keys KeyCode
{
get
{
return Hotkey & Keys.KeyCode;
}
}
public Keys ModifiersKeys
{
get
{
return Hotkey & Keys.Modifiers;
}
}
public bool Control
{
get
{
return (Hotkey & Keys.Control) == Keys.Control;
}
}
public bool Shift
{
get
{
return (Hotkey & Keys.Shift) == Keys.Shift;
}
}
public bool Alt
{
get
{
return (Hotkey & Keys.Alt) == Keys.Alt;
}
}
public Modifiers ModifiersEnum
{
get
{
Modifiers modifiers = Modifiers.None;
if (Alt) modifiers |= Modifiers.Alt;
if (Control) modifiers |= Modifiers.Control;
if (Shift) modifiers |= Modifiers.Shift;
return modifiers;
}
}
public bool IsOnlyModifiers
{
get
{
return KeyCode == Keys.ControlKey || KeyCode == Keys.ShiftKey || KeyCode == Keys.Menu;
}
}
public bool IsValidKey
{
get
{
return KeyCode != Keys.None && !IsOnlyModifiers;
}
}
Ai-je besoin d'ajouter [JsonIgnore]
à tous (j'ai aussi beaucoup d'autres classes), ou il y a de mieux pour ignorer tous les obtenir uniquement les propriétés?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire en mettant en œuvre une coutume
IContractResolver
et l'utilisation que lors de la sérialisation. Si vous sous-classe de laDefaultContractResolver
, cela devient très facile à faire:Ici est un programme de test démontrant comment l'utiliser:
Voici la sortie de la ci-dessus. Notez que la propriété en lecture seule
LowerCaseName
n'est pas inclus dans la sortie.Utiliser le mode OptIn de JSON.net et vous aurez besoin pour décorer les propriétés que vous souhaitez sérialiser. Ce n'est pas aussi bon qu'automatiquement le retrait de toutes les propriétés en lecture seulement, mais il peut vous faire économiser un peu de travail.
Udate: Ajout d'une autre possibilité en utilisant la réflexion
Si la solution ci-dessus n'est pas encore tout à fait ce que vous cherchez, vous pouvez utiliser la réflexion pour faire de dictionnaire des objets qui seraient ensuite être sérialisé. Bien sûr, l'exemple ci-dessous ne fonctionne que pour des classes simples, de sorte que vous devez ajouter la récursivité si vos classes contenir d'autres classes. Cela devrait au moins vous pointer dans la bonne direction.
La sous-routine pour mettre les résultats filtré dans un dictionnaire:
Un extrait montrant son utilisation:
Vous pouvez utiliser un contrat de résolution comme ceci:
Elle exclut de propriétés calculées, mais comprennent C#6 obtenir uniquement les propriétés et toutes les propriétés avec un jeu de méthode.
Json.net ne avoir la capacité de conditionnelle sérialiser les propriétés sans un attribut ou d'un contrat de résolution. Ceci est particulièrement utile si vous ne voulez pas que votre projet d'avoir une dépendance sur Json.net.