gpt4 book ai didi

c# - 如何使用 JsonConverter 在 System.Text.Json.JsonSerializer.Serialize() 中排除属性的序列化

转载 作者:行者123 更新时间:2023-12-02 01:12:37 30 4
gpt4 key购买 nike

我希望能够在使用 System.Text.Json.JsonSerializer 进行序列化时排除属性。我不想在任何想要执行此操作的地方使用 JsonIgnore 属性。我希望能够通过某种目前不存在的 Fluent API 来定义仅在序列化期间排除的属性。

我能找到的唯一选择是定义一个 JsonConverter 并将其添加到我传递给 Serialize() 方法的 JsonSerializerOptions 上的转换器列表中像这样:

var options = new JsonSerializerOptions();
options.Converters.Add(new BookConverter());
json = JsonSerializer.Serialize(book, options);

在 JsonConverter 中,我必须使用 Utf8JsonWriter 自己编写整个 JSON 表示形式,不包括我不想序列化的属性。仅仅排除某个属性就需要做大量的工作。虽然 JsonConverter 是 .NET 团队提供的一项出色的可扩展性功能,但对于我的用例而言,它的级别太低了。有谁知道任何其他方法可以实现属性的排除,而不必自己编写 JSON 表示形式?

我不想执行以下操作:

  • 使用属性,或在运行时动态添加属性
  • 将属性的访问修饰符更改为 privateprotected
  • 使用第三方库,因为如果我使用 Json.NET,我的问题就可以解决。

示例:

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<Book>
{
public override Book Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
// Use default implementation when deserializing (reading)
return JsonSerializer.Deserialize<Book>(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();
}
}

最佳答案

选项 1 - 转换到界面

  1. 提取描述所需对象结构的接口(interface)。

    public interface IBook
    {
    public int Id { get; set; }
    public string Name { get; set; }
    }
  2. 在原来的类上实现 class Book : IBook

  3. 使用 string Serialize(object value, Type inputType, JsonSerializerOptions options = null); 的跟随重载

    json = JsonSerializer.Serialize(book, typeof(IBook), options);

    如果您要序列化 ​​Books 的数组(复数),您需要通过 typeof(IEnumerable<IBook>)作为一个论点。

选项 2 - 使用 AutoMapper

如果您无法访问原始的 Book,这会很有用。类。

  1. 创建LiteBook类:

    public class LiteBook
    {
    public int Id { get; set; }
    public string Name { get; set; }
    }
  2. 创建映射配置:

    var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<Book, LiteBook>();
    });
  3. 映射并序列化

    json = JsonSerializer.Serialize(new Mapper(config).Map<LiteBook>(book), options)

关于c# - 如何使用 JsonConverter 在 System.Text.Json.JsonSerializer.Serialize() 中排除属性的序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58566735/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com