如何使用使用C#.NET Core REST API中的库的客户端重命名JsonPropertyName



最新更新w/Answer

(2020年10月26日(-查看@N.Dogac的解决方案,我在阅读本文档时得到了一个有效的解决方案https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-converters-how-to.

答案如下:https://github.com/RyanHarlich/My-Stackoverflow-Dotnet-Core-REST-API-Question/commit/0db8fa860eda7e9d201874f8f1abc38d168e0eaf.

更新

(2020年10月2日(-我意识到复制它可能很困难和/或很耗时,所以我添加了一个GitHub回购来关注实际问题;当然,这只是一个样本,而不是我的实际工作,所以细节被省略了。我只提供了足够的信息来解决我的问题。单击此处我的GitHub Repo或点击实际链接(https://github.com/RyanHarlich/My-Stackoverflow-Dotnet-Core-REST-API-Question)

如果没有人有更好的解决方案,我会在一段时间后尝试@N.Dogac的解决方案。

问题

问题: 我想知道如何使用C#.NET Core REST API中的库重命名客户端的JSONPropertyName。

例如:

图书馆

库DLL w/MasterNode,可增强模型细节

public abstract class APIModel {
public MasterNode Links { get; set; }
public void AddInfo(IUnitOfWork context) {
Links = context.InheritedMasterNode;
Links.Add();
}
public abstract class MasterNode {
public abstract List<float> Info { get; set; }
public void Add() {
Info = new List<float>() { 100.0f };
}
}
}

库DLL中的模型

public class Info : APIModel {
public int id;
public String title;
}

在库中,DLL包含InfoController

[Route("api/[controller]")]
[ApiController]
public class InfosController : ControllerBase {
private readonly IUnitOfWork _unitOfWork;
public InfosController(IUnitOfWork context) {
_unitOfWork = context;
}
// GET: api/Infos
[HttpGet]
public async Task<ActionResult<IEnumerable<Models.HyperMediaControls.APIBase>>> GetAPIs() {
ResetInfo().Wait();
var conn = _unitOfWork.DBContext.Database.GetDbConnection();
if (conn.State != ConnectionState.Open)
conn.Open();
_unitOfWork.DBContext.Database.ExecuteSqlRaw("SET IDENTITY_INSERT Info ON");
Info info = new Library.Models.Info() { Id = 1 };
info.Title = "Info";
await _unitOfWork.Repository<Info>().InsertEntityAsync(info);
await _unitOfWork.SaveChangesAsync();
conn.Close();
Add(info);
return await _unitOfWork.Repository<Info>().ToListAsync();
}
private async Task ResetInfo() {
Info info = await _unitOfWork.Repository<Info>().FirstOrDefault();
if (info != null) {
_unitOfWork.Repository<Info>().Empty(info);
await _unitOfWork.SaveChangesAsync();
}
}
public void Add(Models.HyperMediaControls.APIBase info) {
info.AddInfo(, _unitOfWork);
}
}

客户

客户:[JsonPropertyName("InfoInherited"(]是我正在努力实现的目标

public abstract class InheritedMasterNode : MasterNode {
[JsonPropertyName(“InfoInherited”)]
public override List<float> Info { get; set; } = null;
}

详细信息

为了将子InheritedMasterNode从客户端获取到库,我使用了这个方法,我没有添加它,因为它是Stack Overflow帖子的大量代码:https://stackoverflow.com/a/59753787/8360201

  • 注意:使用IUnitOfWork将InheritedMasterNode注入到MasterNode处理程序中,并在具有UnitOfWork的InheritedMaster Node属性的APIModel类中使用它

我面临的问题如我在此处的评论所述:https://stackoverflow.com/a/37927869/8360201

  • 注意:这个Stack Overflow帖子的答案不起作用,因为它序列化为字符串;作为,我使用C#.NET核心REST API控制器

请让我知道你需要什么,以便我帮助你复制。我遗漏了很多代码,因为这是我的私人回购,读起来太多了,无法理解较小的问题。

概述:

  • 属于库DLL:Info、InfoController、APIModel、MasterNode、UnitOfWork、ServiceCollectionExtensions
  • 属于客户端:InheritedMasterNode,Startup.ConfigureService

我得出的结论是,这是不可能的,需要.NET核心团队对这些DLL进行升级,但我最后一次尝试是询问堆栈溢出社区:

  • 使用Microsoft.AspNetCore.Mvc
  • 使用Microsoft.EntityFrameworkCore

这是实际输出与所需输出的对比:info->infoInherited

实际输出:

[
{
"id": 1,
"title": "Info",
"links": {
"info": [
]
}
}
]

期望输出:

[
{
"id": 1,
"title": " Info ",
"links": {
"infoInherited": [
]
}
}
]

您应该能够通过为有问题的类型注册Json转换器来实现这一点

services.AddMvc()
.AddJsonOptions(options =>
{
options.SerializerSettings.Converters.Add(new  APIModelJsonConverter());
});
class APIModelJsonConverter: JsonConverter<APIModel> {
public override void Write(Utf8JsonWriter writer, APIModel m, JsonSerializerOptions options) {
var intermediateJson = JsonSerializer.Serialize(m, options);
var intermediateObject = JsonSerializer.Deserialize<Dictionary<string, object>>(intermediateJson, options);
intermediateObject["infoInherited"] = intermediateObject["info"];
intermediate.Remove("info");
writer.Write(intermediate, options);
}
} 

最新更新