【问题标题】:Using a REST Api, how to include "any kind of json" in my typed request model?使用 REST Api,如何在我的类型化请求模型中包含“任何类型的 json”?
【发布时间】: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。很抱歉造成混淆,我希望微软有更好的命名政策。

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


【解决方案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; }
}

像魅力一样工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2021-12-07
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多