0

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

4

1 回答 1

1

您可以使用 JSON扩展数据。反序列化时,它将在 DTO 中找不到的其他属性映射到您添加到 DTO 的适当属性的字典属性。

示例用法:

public class ChapterDto
{
    public int ChapterId { get; set; }

    public string ChapterName { get; set; }

    [JsonExtensionData]
    public IDictionary<string, JToken> AdditionalData { get; set; }
}
于 2021-04-20T13:10:07.297 回答