【问题标题】:MVC 4 Post on Nested JSON is null嵌套 JSON 上的 MVC 4 帖子为空
【发布时间】:2015-03-30 14:38:14
【问题描述】:

我目前正在开发与 MVC4 API 通信的移动应用程序。 我刚刚注意到的问题是它似乎由于某种原因无法解析嵌套对象。

例子:

我正在向 url (http://localhost/DoSomething) 发布以下数据:

{
   "id":610,
   "dynamic":[
      {
         "fieldId":2756,
         "fieldValue":""
      },
      {
         "fieldId":2757,
         "fieldValue":""
      }
   ],
   "person":{
      "name":"test",
      "age":"123",
      "dateOfBirth":"test",
      "groups":[
         {
            "groupId":1182
         },
         {
            "groupId":1311
         },
         {
            "groupId":673
         }
      ]
   }
}

知道 MVC 将尝试针对提供的模型对其进行序列化,因此我为请求创建了以下模型:

    public class PersonRequest : RequestBase
    {
        public class Field
        {
            public int fieldId { get; set; }
            public string fieldValue { get; set; }
        }

        public class Group
        {
            public int groupId { get; set; }
        }

        public class Person
        {
            public string name { get; set; }
            public string age { get; set; }
            public string dateOfBirth { get; set; }
            public IEnumerable<Group> groups { get; set; }
        }

        public int id { get; set; }
        public IEnumerable<Field> dynamic { get; set; }
        public Person person { get; set; }
    }

为了处理输入,我创建了以下路线(有效):

routes.MapRoute(
                name: "PersonRequest",
                url: "DoSomething",
                defaults: new { controller = "Person", action = "Generate" }
            );

还有我的实际路由方式:

[HttpPost]
public ActionResult Generate(PersonRequest request)
{
    return Json(request, JsonRequestBehavior.AllowGet);
}

但是响应是:

{"id":610,"person":null,"dynamic":null}

在寻找可能的解决方案后,人们说您必须在这种情况下使用 IEnumerable 而不是 List。可悲的是,这似乎对我不起作用。


只是一些额外的信息: 我总是可以在数据对象 person 和 dynamic 的客户端上使用 JSON.stringify,并最终在后端自己反序列化它(如本主题所示:parse Json text to C# object in asp mvc 4),但必须有更好的解决方法来解决这个问题。


更改:在生成的 json 中将组更改为动态。


已解决:https://stackoverflow.com/a/29349804/2076351

【问题讨论】:

  • 如何在生成的 JSON 中包含 groups 键?是来自RequestBase 班级吗?
  • RequestBase 包含一个键“散列”,仅此而已。幸运的是,我已经解决了。

标签: c# asp.net json asp.net-mvc


【解决方案1】:

你为什么使用 IEnumerable,查询在最后被触发, 使用 List 并检查。

public class PersonRequest : RequestBase
    {
        public class Field
        {
            public int fieldId { get; set; }
            public string fieldValue { get; set; }
        }

        public class Group
        {
            public int groupId { get; set; }
        }

        public class Person
        {
            public string name { get; set; }
            public string age { get; set; }
            public string dateOfBirth { get; set; }
            public List<Group> groups { get; set; }
        }

        public int id { get; set; }
        public List<Field> dynamic { get; set; }
        public Person person { get; set; }
    }

【讨论】:

  • 这是我第一个失败的场景,幸运的是我找到了解决方案 :) 如果您好奇,请查看我的其他答案。
【解决方案2】:

解决了。

看来我的后端设置正确。修复是数据被发送到后端的方式。

如果您向后端发送嵌套对象,则进行解析。你必须做两件事:

  1. 对发送到数据的整个数据使用 JSON.stringify
  2. 使用适当的内容类型,例如:

    xhr.open("POST", url);

    xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");

    xhr.setRequestHeader("hash", params.hash);

    xhr.send(JSON.stringify(params.data));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多