【问题标题】:C# WebAPI parse Json data with extra bracesC# WebAPI 使用额外的大括号解析 Json 数据
【发布时间】:2018-03-09 14:10:11
【问题描述】:

这可能是一种非常罕见的情况,但我最终遇到了问题并且没有找到任何解决方案。

我有一个用 C# 中的 MVC WebAPI 编写的 WebAPI 控制器。我有一个接收自定义对象的 post 方法。

[HttpPost]
public HttpResponseMessage SendEmail([FromBody]Email email)
{

}

下面是Email类,注意EmailData是dynamic类型。

public class Email
{
    public string EmailTo { get; set; }

    public dynamic EmailData { get; set; }
}

当我发送JSON 有效负载作为帖子时,EmailData 属性会在对象中添加额外的花括号“{}”。这给了我一个问题,因为我的动态数据无法解析带有额外花括号“{}”的JSON

{
  "EmailFrom": "abc.xyz@abc.com",
  "EmailData": {
    "FirstName": "Rushi",
    "LastName": "Joshi"}
}

如果由于dynamic 类型而发生这种情况,那么我不想更改类型,因为我不确定所有键/值请求者可能会发送什么。我正在使用dynamic 数据从中提取数据。

这表明正在解析 EmailData 并添加了额外的花括号。

【问题讨论】:

  • 我没有看到任何“额外的大括号”...电子邮件数据是一个对象,正在序列化为 json 作为对象。这就是在 json 中在一组花括号内定义对象的方式。
  • 那些不是多余的,它显示的是嵌套的。
  • 你有一个 Web API 控制器。 “用 MVC WebAPI 编写”不,它是用 Web API 编写的。本题不涉及MVC。
  • 为什么 EmailData 必须是动态的?您可以拥有一个具有可为空字段的类,如果未在 Json 中指定,它们将不会被设置...

标签: c# json asp.net-web-api


【解决方案1】:

使用Dictionary对象而不是动态的,它会绑定你的键值对数据,

    public class Email
    {
        public string EmailTo { get; set; }

        public Dictionary<string,string> EmailData { get; set; }
    }

你的 json 将是,

{
  "EmailTo": "abc.xyz@abc.com",
  "EmailData": {
    "FirstName": "Rushi",
    "LastName": "Joshi"}
}

【讨论】:

    【解决方案2】:

    提供的 JSON 有效: https://jsonlint.com/

    具有多个属性的对象将始终以该格式返回。

    "EmailData": {
        "FirstName": "Rushi",
        "LastName": "Joshi"}
    

    这是一个带有两个名称/值对的 EmailData 对象。您有一个嵌套在原始对象中的对象。

    这里有一些文档可供阅读以进一步澄清。 https://www.json.org/

    【讨论】:

      【解决方案3】:

      如果您想将动态 JSON 存储在您的 Email 类中,那么您可以使用 Newtonsoft.Json 包。

          public class Email
          {
              public string EmailTo { get; set; }
      
              public JOject EmailData { get; set; }
          }
      

      它将存储任何类型的 JSON。所以你可以在运行时解析内部 JSON 对象。

      【讨论】:

        【解决方案4】:

        谢谢大家,是的,你们都给出了很好的答案,特别感谢 Stevenfowler16,他描述了这是处理 JSON 对象的正确方式。

        问题是我无法删除来自其他库的动态对象类型,我也无法将任何内容更改为 API 的签名。但是是的,下面的事情对我有帮助。

        em.EmailData = System.Web.Helpers.Json.Decode(em.EmailData.ToString());
        

        这符合我的目的,但再次感谢大家,您的解决方案为我提供了一些方向。

        问候

        拉什

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-20
          • 2011-04-03
          • 2016-08-24
          • 1970-01-01
          • 2020-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多