J'ai une classe DTO que je sérialise.
Json.Serialize(MyClass)
Comment puis-je exclure un public propriété de celui-ci ?
(Il doit être public, car je l'utilise dans mon code quelque part ailleurs)
J'ai une classe DTO que je sérialise.
Json.Serialize(MyClass)
Comment puis-je exclure un public propriété de celui-ci ?
(Il doit être public, car je l'utilise dans mon code quelque part ailleurs)
Si vous utilisez System.Text.Json
alors vous pouvez utiliser [JsonIgnore]
.
FQ : System.Text.Json.Serialization.JsonIgnoreAttribute
Documents officiels de Microsoft : JsonIgnoreAttribute
Comme indiqué aquí :
La bibliothèque est intégrée dans le cadre partagé de .NET Core 3.0.
Pour les autres frameworks cibles, installez le paquetage NuGet System.Text.Json NuGet. Ce paquet prend en charge :
- .NET Standard 2.0 et versions ultérieures
- .NET Framework 4.6.1 et versions ultérieures
- .NET Core 2.0, 2.1 et 2.2
Pour les enregistrements de C# 9, c'est [property: JsonIgnore]
using System.Text.Json.Serialization;
public record R(
string Text2
[property: JsonIgnore] string Text2)
Pour le style classique, c'est toujours [JsonIgnore]
.
using System.Text.Json.Serialization;
public record R
{
public string Text {get; init; }
[JsonIgnore]
public string Text2 { get; init; }
}
Vous pouvez également utiliser le [NonSerialized]
attribut
[Serializable]
public struct MySerializableStruct
{
[NonSerialized]
public string hiddenField;
public string normalField;
}
Extrait de la documentation de MS :
Indique qu'un champ d'une classe sérialisable ne doit pas être sérialisé. Cette classe ne peut pas être héritée.
Si vous utilisez Unity par exemple ( ce n'est pas seulement pour Unity ), cela fonctionne avec UnityEngine.JsonUtility
using UnityEngine;
MySerializableStruct mss = new MySerializableStruct
{
hiddenField = "foo",
normalField = "bar"
};
Debug.Log(JsonUtility.ToJson(mss)); // result: {"normalField":"bar"}
Ajouter la version System.Text.Json pour dotnet core
Pour la compilation, ajoutez [JsonIgnore] comme suggéré dans la réponse ci-dessus.
Pour l'exécution, JsonConverter doit être ajouté dans les options.
Tout d'abord, créez un JsonConverter pour le type que vous voulez exclure, par exemple ICollection<LabMethod>
en dessous de
public class LabMethodConverter : JsonConverter<ICollection<LabMethod>>
{
public override ICollection<LabMethod> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
//deserialize JSON into a ICollection<LabMethod>
return null;
}
public override void Write(Utf8JsonWriter writer, ICollection<LabMethod> value, JsonSerializerOptions options)
{
//serialize a ICollection<LabMethod> object
writer.WriteNullValue();
}
}
Puis ajouter aux options lorsque vous sérialisez Json
var options = new JsonSerializerOptions();
options.Converters.Add(new LabMethodConverter());
var new_obj = Json(new { rows = slice, total = count }, options);
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
7 votes
Quel cadre de sérialisation utilisez-vous ?
42 votes
IgnoreDataMember
ScriptIgnore
JsonIgnore
en fonction du sérialiseur que vous utilisez3 votes
Il convient également de noter l'attribut [NonSerialized], qui n'est applicable qu'aux champs (et non aux propriétés), mais qui a le même effet que JsonIgnore.
0 votes
Le commentaire de Trynko est très utile.... si vous utilisez IgnoreDataMember sur un champ, il n'y aura pas d'erreur, mais il ne sera pas appliqué.
1 votes
Faites attention à vos espaces de noms. L'attribut [JsonIgnore] existe dans les espaces de noms Newtonsoft.Json et System.Text.Json.Serialization. Il est facile d'utiliser Newtonsoft.Json.JsonIgnore sur le modèle mais ensuite System.Text.Json.Serialization.JsonSerializer.Serialize pour sérialiser votre modèle (ou vice versa). L'attribut JsonIgnore est alors ignoré :)