So schließen Sie eine Eigenschaft mithilfe eines JsonConverters von der Serialisierung in System.Text.Json.JsonSerializeC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 So schließen Sie eine Eigenschaft mithilfe eines JsonConverters von der Serialisierung in System.Text.Json.JsonSerialize

Post by Anonymous »

Ich möchte bei der Serialisierung mit System.Text.Json.JsonSerializer eine Eigenschaft ausschließen können. Ich möchte nicht überall dort ein JsonIgnore-Attribut verwenden, wo ich dies tun möchte. Ich möchte in der Lage sein, die Eigenschaften, die ich während der Serialisierung ausschließen möchte, nur über eine Art Fluent-API zu definieren, die derzeit nicht existiert.

Die einzige Option, die ich finden konnte, besteht darin, einen JsonConverter zu definieren und ihn zur Liste der Konverter in den JsonSerializerOptions hinzuzufügen, die ich wie folgt an die Serialize()-Methode übergebe:

Code: Select all

var options = new JsonSerializerOptions();
options.Converters.Add(new BookConverter());
json = JsonSerializer.Serialize(book, options);
Im JsonConverter müsste ich die gesamte JSON-Darstellung selbst mit einem Utf8JsonWriter schreiben, mit Ausnahme der Eigenschaft, die ich nicht serialisieren möchte. Es ist eine Menge Arbeit, eine Eigenschaft einfach ausschließen zu können. Der JsonConverter ist zwar eine großartige Erweiterbarkeitsfunktion des .NET-Teams, für meinen Anwendungsfall ist er jedoch einfach zu niedrig. Kennt jemand eine andere Möglichkeit, den Ausschluss der Eigenschaft zu erreichen, ohne die JSON-Darstellung selbst schreiben zu müssen?

Ich möchte Folgendes nicht tun müssen:
  • Ein Attribut verwenden oder zur Laufzeit dynamisch ein Attribut hinzufügen
  • Ändern Sie den Zugriffsmodifikator der Eigenschaft in etwas wie „private“ oder „protected“
  • Verwenden Sie eine Bibliothek eines Drittanbieters, da mein Problem lösbar ist, wenn ich Json.NET verwende.
Beispiel:

Code: Select all

class Program
{
void Main()
{
// We want to serialize Book but to ignore the Author property
var book = new Book() { Id = 1, Name = "Calculus", Author = new Author() };

var json = JsonSerializer.Serialize(book);
// Default serialization, we get this:
// json = { "Id": 1, "Name": "Calculus", "Author": {} }

// Add our custom converter to options and pass it to the Serialize() method
var options = new JsonSerializerOptions();
options.Converters.Add(new BookConverter());
json = JsonSerializer.Serialize(book, options);
// I want to get this:
// json = { Id: 1, Name: "Calculus" }
}
}

public class Author { }

public class Book
{
public int Id { get; set; }
public string Name { get; set; }
public Author Author { get; set; }
}

public class BookConverter : JsonConverter
{
public override Book Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
// Use default implementation when deserializing (reading)
return JsonSerializer.Deserialize(ref reader, options);
}

public override void Write(Utf8JsonWriter writer, Book value, JsonSerializerOptions options)
{
// Serializing. Here we have to write the JSON representation ourselves
writer.WriteStartObject();

writer.WriteNumber("Id", value.Id);
writer.WriteString("Name", value.Name);
// Don't write Author so we can exclude it

writer.WriteEndObject();
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post