使用 REST Api,如何在我的类型化请求模型中包含“任何类型的 json”?

Posted

技术标签:

【中文标题】使用 REST Api,如何在我的类型化请求模型中包含“任何类型的 json”?【英文标题】:Using a REST Api, how to include "any kind of json" in my typed request model? 【发布时间】:2021-09-30 10:54:11 【问题描述】:

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

这个 web api 有一个调用来获取保存数据的请求模型和一些稍后检索数据的调用。

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

这一切都有效。

但是,我现在有一个要求,调用者希望保存并稍后检索任意数据(让我们说一个随机 json)作为这些字段之一。我可以从数据库中保存和加载json这不是问题,我的问题是为我的请求构建web 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 放入其中。但如果这个问题没有答案,我会认为这是最后的解决方法。

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

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

【问题讨论】:

你在使用 Json.net 吗?如果是这样,那么您可以使用 JToken 作为该字段的类型。 您没有指定您的核心版本,但给出了例如3.1 并且您正在使用 system.text.json,JsonElement 应该可以工作:anthonygiretti.com/2020/05/10/… 恐怕应用还是.NET Framework,但我确实使用Json.Net Dictionary 可能是一个优雅的解决方案。尤其是在数据平坦的情况下。 @RoarS。那是微软的命名策略。这太糟糕了。 Asp.Net-Core 是名为“Core”的“Asp.Net”版本,但不使用.NET Core,您可以使用.Net Framework。很抱歉造成混淆,我希望微软有更好的命名政策。 【参考方案1】:

总结一下,正如我建议的那样,我使用了来自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; 

像魅力一样工作。

【讨论】:

以上是关于使用 REST Api,如何在我的类型化请求模型中包含“任何类型的 json”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的rest api post请求不能将我的数组保存在我的mongodb数据库中

使用嵌套查询 REST API 获取请求

带有嵌套模式的类型化REST API

如何在我的 Django Rest Framework 项目中允许所有跨域请求?

C# REST API - 如何使用错误代码扩展模型状态错误

如何使用JSON正文在REST API POST方法中传递多个记录