使用 REST Api,如何在我输入的请求模型中包含 "any kind of json"?

Using a REST Api, how to include "any kind of json" in my typed request model?

我正在使用 .NET Framework 和 ASP.NET Core 创建 REST Web Api。

此网站 api 有一个获取请求模型以保存数据的调用和一些稍后检索数据的调用。

大部分数据是我后台需要的结构化信息,保存在数据库中不同的字段和表中。在检索时,它从这些表中加载并返回。

一切正常。

但是,我现在有一个要求,即调用者想要保存并在以后检索任意数据(假设是随机 json)作为这些字段之一。我可以从数据库中保存和加载 json 这不是问题,我的问题是为我的请求构建网络 api 模型。

[HttpPost]
public IActionResult Save([FromBody] ApiCallRequestModel request)
{
    // ...
}

public sealed class ApiCallRequestModel
{
    // structured, well known information
    public int? MaybeSomeNumber { get; set; }

    [Required]
    public string SomeText { get; set; }

    [Required]
    public SubModel SomeData { get; set; }
    
    // one field of unknown json data
    public ??? CustomData { get; set; }
}

我可以考虑 dynamic 甚至 ExpandoObjectJObject 来尝试,我可能会尝试,但我想要一个可行的解决方案,因为它是最佳实践,而不仅仅是因为我试过了,今天我的简单测试并没有失败。

如果一切都失败了,我可以将字段设为字符串并告诉客户端将序列化的 json 放入其中。但如果这个问题没有答案,我认为这是最后的解决方法。

事实证明,google 这个主题极其困难,因为我将使用的所有词都会引导我进入解释 Json 我的请求模型本身序列化的页面。我知道它是如何工作的,这不是问题。结构化数据 免费 json 的混合是我无法从有点权威的来源中找到的。

那么你会在这里使用什么类型,在你的模型 属性 中接收任意 json 的最佳实践是什么

总而言之,正如我所建议的那样,我使用了 Json.NET nuget 包中的 JToken,因为我的项目中已经有了该包。

[HttpPost]
public IActionResult Save([FromBody] ApiCallRequestModel request)
{
    // ...
}

public sealed class ApiCallRequestModel
{
    // structured, well known information
    public int? MaybeSomeNumber { get; set; }

    [Required]
    public string SomeText { get; set; }

    [Required]
    public SubModel SomeData { get; set; }
    
    // one field of unknown json data
    public JToken CustomData { get; set; }
}

很有魅力。