如何解决.Net Core webApi 在运行时向传入的 Dto 添加属性
我有一个核心 webApi 端点的情况。我希望能够将传入的 Json 序列化为 Dto。 Dto 将包含必要的字段,但传入的请求可能包含其他属性(某些客户端不同)。我还需要能够捕获其他属性,但它们只能在运行时知道(记录将存储在 DocumentDB (Mongo) 中)。我正在反序列化为动态对象:
[Route("api/Chapter/CreateNewChapter")]
[HttpPost]
public IActionResult CreateNewChapter([FromBody]dynamic incomingJson)
{
dynamic incomingObject = JsonConvert.DeserializeObject<ExpandoObject>(incomingJson.ToString(),new ExpandoObjectConverter());
if (!IsAuthenticated(incomingObject))
return Unauthorized();
var createNewChapter = new CreateNewChapter();
var outgoingJson = createNewChapter.Process(incomingObject);
var resultJson = JsonConvert.SerializeObject(outgoingJson,Formatting.Indented);
return Ok(resultJson);
}
这工作得很好,问题是没有可用于 Swagger 的架构或具体对象,而且对所有字段的验证是一场噩梦。
所以最终我想做这样的事情:
public class ChapterDto
{
public int ChapterId {get; set};
public string ChapterName {get; set};
)
那么如果请求中发送了额外的属性(Json),可以在运行时动态添加这些属性。此外,我将添加元数据属性“ParentChapterId”等。
我是否应该尝试将传入的 json 映射到 dto 以便我知道我们有有效的传入属性,然后如果传递映射整个 Json 对象到动态对象,就像我在上面做的那样?或者有没有更好的方法来实现这一目标?
解决方法
您可以使用 JSON extension data。反序列化时,它会将 DTO 中未找到的其他属性映射到您添加到 DTO 的具有适当属性的字典属性。
示例用法:
public class ChapterDto
{
public int ChapterId { get; set; }
public string ChapterName { get; set; }
[JsonExtensionData]
public IDictionary<string,JToken> AdditionalData { get; set; }
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。