【问题标题】:Issue deserializing array of int from JSON post从 JSON 帖子中反序列化 int 数组
【发布时间】:2014-04-23 20:32:19
【问题描述】:

尝试通过 Ajax 提交 JSON 负载到我的 MVC 控制器时,我看到了非常奇怪的行为。

代码如下:

[HttpPost]
public ActionResult ResetEligibility(EmployeeEligibilityFilter filter) { ... }

public class EmployeeEligibilityFilter
{
    public List<int> Selection { get; set; }
    public bool SelectionInverted { get; set; }
    public int? BenACACalendarCycleId { get; set; }
    ...
}

有效负载:

{"BenACACalendarCycleId":2,"SelectionInverted":false,"Selection":[680,698,875]}

现在,如果我提供少于 3 个元素的 Selection 列表,Selection 属性会突然在服务器端以 null 出现。

{"BenACACalendarCycleId":2,"SelectionInverted":false,"Selection":[680,875]}

其他属性继续正确反序列化。

我们在这里迷路和困惑......


更多调查:将模型属性从 List&lt;int&gt; 更改为 List&lt;object&gt; 神奇地使事情正常进行。存储在对象列表中的元素仍然是System.Int32。 我什至尝试像这样并排使用它们:

public class EmployeeEligibilityFilter
{
    public int? BenACACalendarCycleId { get; set; }
    public bool SelectionInverted { get; set; }
    public List<int> Selection { get; set; }
    public List<object> _Selection { get; set; }
}

并在两者中发送完全相同的数组:

{"BenACACalendarCycleId":2,"SelectionInverted":false,"Selection":[663],"_Selection":[663]}

最终结果还是一样。 Selection 显示为 null,但 _Selection 已正确反序列化。

巫毒魔法...

【问题讨论】:

  • 您能运行 fiddler 并发布您在此处发布的两个不同查询的结果吗?
  • 我想看一下用于发布帖子的代码的 sn-p,ResetEligibility 内部的一些代码,以及使用 Fiddler 之类的工具进行一些间谍活动的结果,之前花时间制作一个测试应用程序。 (看起来詹姆斯也提出了同样的建议。)
  • 我发布的两个 JSON 有效负载取自 Fiddler,即这正是发送到服务器的内容。 ResetEligibility action 实际上还没有做任何事情。我通过在方法中设置断点并检查 filter 参数来查看破损
  • 我认为可能反序列化程序将逗号视为小数分隔符,尝试将 List 更改为 List 作为一个小测试......
  • 它似乎正在使用decimal,但我怀疑逗号是这里的问题。在我的最后一次迭代中,我使用一个没有逗号的选择值进行测试。

标签: c# asp.net-mvc json


【解决方案1】:

试试看:

 [TestMethod]
        public void GetAAA() {

            var json = "{'BenACACalendarCycleId':2,'SelectionInverted':false,'Selection':[663],'_Selection':[663]}";

            EmployeeEligibilityFilter obj = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<EmployeeEligibilityFilter>(json); 

        }

        public class EmployeeEligibilityFilter
        {
            public int? BenACACalendarCycleId { get; set; }
            public bool SelectionInverted { get; set; }
            public List<int> Selection { get; set; }
            public List<object> _Selection { get; set; }
        }

【讨论】:

  • 这工作正常。一个合乎逻辑的结论是,有某种过滤器或自定义绑定器会搞砸操作参数,但我们没有类似的东西......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 2021-05-04
  • 1970-01-01
  • 2019-02-26
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多