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