277 votes

Comment exclure une propriété de la sérialisation Json ?

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)

7 votes

Quel cadre de sérialisation utilisez-vous ?

42 votes

IgnoreDataMember ScriptIgnore JsonIgnore en fonction du sérialiseur que vous utilisez

3 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.

16voto

Travis Points 169

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

2voto

Tymek Points 1305

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; }
}

0voto

mmmshuddup Points 5497

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"}

0voto

xkimi Points 39

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.com

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.

Powered by:

X