如何将 JsonApiSerializer 设置为默认输入和输出序列化器 C# .NET Core 3+
How to setup JsonApiSerializer as default input and output seriliazers C# .NET Core 3+
我一直在尝试将 JsonApiSerializer (https://github.com/codecutout/JsonApiSerializer) 设置为输入和输出的默认序列化器,这样我就可以为 Ember 提供一个 json:api 兼容的 .NET 服务器具有 Ember 数据的应用程序。
我已通过将以下代码写入 Startup.cs 文件来成功设置输出序列化程序:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddDbContext<Context>(options => options.UseSqlServer(Configuration.GetConnectionString("myDb")));
var sp = services.BuildServiceProvider();
var logger = sp.GetService<ILoggerFactory>();
var objectPoolProvider = sp.GetService<ObjectPoolProvider>();
services.AddMvc(opt =>
{
var serializerSettings = new JsonApiSerializerSettings();
**
var jsonApiFormatter = new NewtonsoftJsonOutputFormatter(serializerSettings, ArrayPool<Char>.Shared, opt);
opt.OutputFormatters.RemoveType<NewtonsoftJsonOutputFormatter>();
opt.OutputFormatters.Insert(0, jsonApiFormatter);
**
var mvcNewtonsoftSettings = new MvcNewtonsoftJsonOptions();
var jsonApiInputFormatter = new NewtonsoftJsonInputFormatter(logger.CreateLogger<NewtonsoftJsonInputFormatter>(), serializerSettings, ArrayPool<Char>.Shared, objectPoolProvider, opt, mvcNewtonsoftSettings);
opt.InputFormatters.RemoveType<NewtonsoftJsonInputFormatter>();
opt.InputFormatters.Insert(0, jsonApiInputFormatter);
//opt.InputFormatters.OfType<NewtonsoftJsonInputFormatter>().FirstOrDefault().SupportedMediaTypes.Add("application/vnd.api+json");
}).AddNewtonsoftJson();
}
但是输入部分还没有工作!
我一直在尝试从遵循此结构的 Ember 应用程序接收代码:
{
"data":
{
"type": "manufacturer",
"name": "Fabricante 1",
"relationships": {
"products": {
"data": [
{
"type": "product",
"id": "1"
},
{
"type": "product",
"id": "2"
}
]
}
}
}
}
厂商POST的.NET服务器绑定模型是这样的:
public class CreateManufacturerBindingModel
{
public string Type { get; set; } = "manufacturer";
public string Name { get; set; }
public AssignProductBidingModel[] Products { get; set; }
}
public class AssignProductBidingModel
{
public string Type { get; set; } = "product";
public int Id { get; set; }
}
一段时间以来,我一直在尝试这些代码的一些变体,我所能得到的只是 Null 值 "Name" 和 “产品” CreateManufacturerBindingModel
的属性
有人知道为什么我总是在 .NET 服务器上获取空值吗?
感谢您的关注!
ASP.NET Core 3.1 默认使用 System.Text.Json 序列化器。您尝试使用的 JsonApiSerializer 需要 Newtonsoft。您可以通过安装以下 nuget 包在项目中使用 Newtonsoft。 (不要使用最新的 5.0.0 版本,因为它需要 net5.0)
Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 3.1.10`
然后您可以按如下方式配置序列化程序。它不允许您替换整个 SerizlierSettings
,但 JsonApiSerializerSettings
只设置了一些属性,因此我们可以直接设置它们
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddNewtonsoftJson(opts =>
{
opts.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
opts.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
opts.SerializerSettings.ContractResolver = new JsonApiContractResolver(new ResourceObjectConverter());
opts.SerializerSettings.DateParseHandling = DateParseHandling.None;
});
}
最后,您需要更新模型,使其包含 Id
字段。这就是 JsonApiSerializer
识别资源对象的方式
public class CreateManufacturerBindingModel
{
public string Type { get; set; } = "manufacturer";
// Need to have an ID property
public string Id { get; set; }
public string Name { get; set; }
public AssignProductBidingModel[] Products { get; set; }
}
有了它,它应该开始将您的对象序列化和反序列化为 JsonApi 对象
我一直在尝试将 JsonApiSerializer (https://github.com/codecutout/JsonApiSerializer) 设置为输入和输出的默认序列化器,这样我就可以为 Ember 提供一个 json:api 兼容的 .NET 服务器具有 Ember 数据的应用程序。
我已通过将以下代码写入 Startup.cs 文件来成功设置输出序列化程序:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddDbContext<Context>(options => options.UseSqlServer(Configuration.GetConnectionString("myDb")));
var sp = services.BuildServiceProvider();
var logger = sp.GetService<ILoggerFactory>();
var objectPoolProvider = sp.GetService<ObjectPoolProvider>();
services.AddMvc(opt =>
{
var serializerSettings = new JsonApiSerializerSettings();
**
var jsonApiFormatter = new NewtonsoftJsonOutputFormatter(serializerSettings, ArrayPool<Char>.Shared, opt);
opt.OutputFormatters.RemoveType<NewtonsoftJsonOutputFormatter>();
opt.OutputFormatters.Insert(0, jsonApiFormatter);
**
var mvcNewtonsoftSettings = new MvcNewtonsoftJsonOptions();
var jsonApiInputFormatter = new NewtonsoftJsonInputFormatter(logger.CreateLogger<NewtonsoftJsonInputFormatter>(), serializerSettings, ArrayPool<Char>.Shared, objectPoolProvider, opt, mvcNewtonsoftSettings);
opt.InputFormatters.RemoveType<NewtonsoftJsonInputFormatter>();
opt.InputFormatters.Insert(0, jsonApiInputFormatter);
//opt.InputFormatters.OfType<NewtonsoftJsonInputFormatter>().FirstOrDefault().SupportedMediaTypes.Add("application/vnd.api+json");
}).AddNewtonsoftJson();
}
但是输入部分还没有工作!
我一直在尝试从遵循此结构的 Ember 应用程序接收代码:
{
"data":
{
"type": "manufacturer",
"name": "Fabricante 1",
"relationships": {
"products": {
"data": [
{
"type": "product",
"id": "1"
},
{
"type": "product",
"id": "2"
}
]
}
}
}
}
厂商POST的.NET服务器绑定模型是这样的:
public class CreateManufacturerBindingModel
{
public string Type { get; set; } = "manufacturer";
public string Name { get; set; }
public AssignProductBidingModel[] Products { get; set; }
}
public class AssignProductBidingModel
{
public string Type { get; set; } = "product";
public int Id { get; set; }
}
一段时间以来,我一直在尝试这些代码的一些变体,我所能得到的只是 Null 值 "Name" 和 “产品” CreateManufacturerBindingModel
的属性有人知道为什么我总是在 .NET 服务器上获取空值吗?
感谢您的关注!
ASP.NET Core 3.1 默认使用 System.Text.Json 序列化器。您尝试使用的 JsonApiSerializer 需要 Newtonsoft。您可以通过安装以下 nuget 包在项目中使用 Newtonsoft。 (不要使用最新的 5.0.0 版本,因为它需要 net5.0)
Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 3.1.10`
然后您可以按如下方式配置序列化程序。它不允许您替换整个 SerizlierSettings
,但 JsonApiSerializerSettings
只设置了一些属性,因此我们可以直接设置它们
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddNewtonsoftJson(opts =>
{
opts.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
opts.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
opts.SerializerSettings.ContractResolver = new JsonApiContractResolver(new ResourceObjectConverter());
opts.SerializerSettings.DateParseHandling = DateParseHandling.None;
});
}
最后,您需要更新模型,使其包含 Id
字段。这就是 JsonApiSerializer
识别资源对象的方式
public class CreateManufacturerBindingModel
{
public string Type { get; set; } = "manufacturer";
// Need to have an ID property
public string Id { get; set; }
public string Name { get; set; }
public AssignProductBidingModel[] Products { get; set; }
}
有了它,它应该开始将您的对象序列化和反序列化为 JsonApi 对象