gpt4 book ai didi

c# - C# asp.net core中现有类的JSON自定义序列化和反序列化

转载 作者:行者123 更新时间:2023-12-05 01:08:23 24 4
gpt4 key购买 nike

我有现有的第三方 DLL - 它有几个类。我没有这个 DLL 的源代码。让我们假设它有如下定义的 Book 类

public class Book
{
public String Id { get; set; }
public String Title { get; set; }
public String Author{ get; set; }
public List<Page> Pages { get; set; }
}

我已经创建了 Asp.net Core Web API 项目并引用了 DLL 并为 http 的 GET 方法编写了 API Controller 。

[HttpGet("{id}")]
public ActionResult<Book> Get(string id)
{
Book b = Book.FindById(id); // This utility function returns Book instance.
return Ok(b);
}

我的要求是 JSON 的返回值应该是这样的

{
"id" : "1234",
"Title" : "How to Custom Serialize JSON",
"Author" : "Myself",
"NumberOfPages" : 100
}

所以基本上,每当发生 JSON 序列化时,我想确保 Pages 属性不会被序列化,因为它有很多复杂性。但我应该能够添加新属性 NumberOfPages。基本上我想控制序列化。我见过很多例子,但我找不到这个我想自定义序列化现有类的特殊情况。

我现在不担心反序列化。

我可以看到序列化从

开始
Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter.WriteObject(TextWriter writer, Object value)

最佳答案

为了有一个全局适用的解决方案:

  1. 创建自定义转换器
  2. 注册该转换器

创建转换器

最简单的方法:创建一个派生自 JsonConverter 的类:

public class BookConverter : JsonConverter<Book>
{
public override void WriteJson(JsonWriter writer, Book value, JsonSerializer serializer)
{
var bookObject = (JObject)JToken.FromObject(value);
bookObject.Remove(nameof(value.Pages));
bookObject.Add(new JProperty("NumberOfPages", value.Pages.Count));
bookObject.WriteTo(writer);
}

public override Book ReadJson(JsonReader reader, Type objectType, Book existingValue, bool hasExistingValue, JsonSerializer serializer)
{
return new Book(); //TODO: fix me, now it is enough to make it compile
}
}
  • 这里我已将 Book 实例(value)转换为 JObject
  • 我通过调用 Remove 忽略了 Pages 属性。
  • 我通过调用 Add 扩展了 NumberOfPages 的输出。
  • 我跳过了 ReadJson 部分,因为它超出了这个问题的范围。

注册转换器

.NET Core 2.x

public void ConfigureServices(IServiceCollection services)
{
services
.AddControllers()
.AddJsonOptions(opts =>
{
opts.SerializerSettings.Converters.Add(new BookConverter());
});
}

.NET Core 3.x 或 .NET 5.x

对于 ASP.NET Core 3.1 或更高版本,默认的 json 序列化程序是 System.Text.Json。为了使用 Json.Net,您需要安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson包裹。这公开了一个名为 AddNewtonsoftJson 的方法,您可以在其中注册自定义转换器:

public void ConfigureServices(IServiceCollection services)
{
services
.AddControllers()
.AddNewtonsoftJson(opts =>
{
opts.SerializerSettings.Converters.Add(new BookConverter());
});
}

使用这种方法,当 ASP.NET Core 调用序列化程序时,所有 Book 实例都将转换为所需的格式。

关于c# - C# asp.net core中现有类的JSON自定义序列化和反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66104155/

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