【问题标题】:Receiving JSON object as a string in ASP.NET Core API在 ASP.NET Core API 中接收 JSON 对象作为字符串
【发布时间】:2018-05-29 22:29:20
【问题描述】:

有没有办法让我接收 json 对象作为字符串并且转换为我的 Web API 中的类?

如果我创建一个与我收到的json 对象的结构相匹配的类,那么一切都会很好地工作,因为ModelBinder 可以处理它。但是,如果我尝试将其保留为字符串,则会失败。 transaction 参数的值最终是 null -- 请参阅下面的 API 方法。

这就是我的 CreditCardTransaction 类的样子,我用它来接收数据到我的 API 方法中:

public class CreditCardTransaction
{
   public int Amount { get; set; }
   public string Description { get; set; }
   public string Token { get; set; } // This is the json object
}

我的 API 方法如下所示:

[HttpPost("process")]
public async Task<IActionResult> ProcessPayment([FromBody] CreditCardTransaction transaction)
{
   if(transaction == null || !ModelState.IsValid)
      return new StatusCodeResult(400);

   // Process transaction
}

我正在为 Stripe Checkout 集成执行此操作,其中 Stripe 前端客户端将敏感的信用卡数据转换为他们所谓的令牌,即 json 对象。因此,在我的后端 API 中,我只想接收令牌以及几个简单的数据点,即数量和描述。

如果我将我的 CreditCardTransaction 类设置为上述结构,transaction 最终会得到一个 null 值。看起来ModelBinder 不喜欢在定义为stringToken 属性中拥有json 对象的想法。

如果我为token 创建一个与json 对象的结构相匹配的类,我可以接收它,但它会给我带来其他问题,更不用说所有不必要的转换了。

我不需要token,除非将它传递给 Stripe 的 API 以完成交易。我不会保存它或操纵它。看起来 Stripe 的 API 无论如何都需要一个 json 对象,所以我只是想接收它并将它按原样传递给他们的 API,而不会弄乱它。

我如何接收这个json 对象?

【问题讨论】:

  • 您是否尝试过使用动态关键字?您可以在这里了解动态关键字的用法。无需定义 POCO 类。 carlserver.com/blog/post/…
  • 对不起,我有点困惑...... Task 是标准对象吗?或者你能显示定义吗
  • @Baskar 是的!动态有效!谢谢你。请将其发布为答案,以便我接受。
  • 尝试使用动态关键字?您可以在这里了解动态关键字的用法。无需定义 POCO 类。 carlserver.com/blog/post/…
  • 只需将Token 声明为JTokenJRaw。见Get Raw json string in Newtonsoft.Json Library

标签: asp.net asp.net-web-api asp.net-core json.net asp.net-core-webapi


【解决方案1】:

刚刚从Request.Body 流中读取:

public async Task<IActionResult> ProcessPayment()
{
    using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
    {
            string rawValue = await reader.ReadToEndAsync();
    }
    ...
}

更新:以下内容不适用于 ASP.NET Core 2.0。

实际上,如果您使用Content-Type: application/json 发帖,参数的string 类型应该可以工作:

public async Task<IActionResult> ProcessPayment([FromBody] string transaction)
{
    ...
}

有一篇关于所有这些事情的好文章: Accepting Raw Request Body Content in ASP.NET Core API Controllers

【讨论】:

  • Content-Type 已经设置为application/json,但由于某种原因,如果我尝试接收string,它就不起作用。我最终在transaction 参数中得到了一个null 值。
  • @Sam yeh,看起来第二个选项不适用于 ASP.NET Core 2.0... 认为直接从 Request.Body 读取是有效的
  • 我不得不回到dynamic 选项。然后我使用JsonConvert.SerializeObject() 序列化对象。好像没必要!
  • unncessary 是 .net 核心的游戏名称。需要一周的时间才能到达 express init 的起点。
猜你喜欢
  • 2016-07-29
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 2017-11-20
相关资源
最近更新 更多