【问题标题】:.Net Core webApi Adding properties at runtime to an incoming Dto.Net Core webApi 在运行时将属性添加到传入的 Dto
【发布时间】:2021-07-14 12:40:09
【问题描述】:

我有一个核心 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 对象映射到动态对象?还是有更好的方法来实现这一点?

【问题讨论】:

标签: c# json asp.net-core-webapi dynamic-properties


【解决方案1】:

您可以使用 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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2021-10-25
    • 2021-07-22
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多