Atu*_*tul 3 c# serialization json asp.net-core
我有现有的第三方 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; }
}
Run Code Online (Sandbox Code Playgroud)
我创建了Asp.net Core Web API项目并引用了DLL并为http的GET方法编写了API控制器。
[HttpGet("{id}")]
public ActionResult<Book> Get(string id)
{
Book b = Book.FindById(id); // This utility function returns Book instance.
return Ok(b);
}
Run Code Online (Sandbox Code Playgroud)
我的要求是 JSON 的返回值应该是这样的
public class Book
{
public String Id { get; set; }
public String Title { get; set; }
public String Author{ get; set; }
public List<Page> Pages { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所以基本上,每当 JSON 序列化发生时,我都想确保Pages属性不被序列化,因为它有很多复杂性。但我应该能够添加新属性NumberOfPages。基本上我想控制序列化。我看过很多例子,但我找不到我想要自定义序列化现有类的特殊情况。
我现在不担心反序列化。
我可以看到序列化从
Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter.WriteObject(TextWriter writer, Object value)
Run Code Online (Sandbox Code Playgroud)
为了获得一个适用于全球的解决方案:
最简单的方法:创建一个派生自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
}
}
Run Code Online (Sandbox Code Playgroud)
Book实例 ( value) 转换为JObject.Pages我通过调用忽略了该属性Remove。NumberOfPages调用Add.ReadJson部分,因为它超出了这个问题的范围。public void ConfigureServices(IServiceCollection services)
{
services
.AddControllers()
.AddJsonOptions(opts =>
{
opts.SerializerSettings.Converters.Add(new BookConverter());
});
}
Run Code Online (Sandbox Code Playgroud)
对于 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());
});
}
Run Code Online (Sandbox Code Playgroud)
通过这种方法,Book当 ASP.NET Core 调用序列化器时,所有实例都将转换为所需的格式。
| 归档时间: |
|
| 查看次数: |
6516 次 |
| 最近记录: |