【问题标题】:JsonConvert.DeserializeObject fails when string contains nulls ("NaN")当字符串包含空值(“NaN”)时,JsonConvert.DeserializeObject 失败
【发布时间】:2018-10-26 18:25:15
【问题描述】:

我正在将数据发布到通过敲除字符串化的控制器:

var data = ko.toJSON(viewModel);

$.ajax({
    type: 'POST',
    url: '@Url.Action("Action")',
    data: { data: data },
    dataType: 'json'
    ....
})

然后在服务器端,我尝试使用 JsonConvert 反序列化数据。

var viewModel = JsonConvert.DeserializeObject<ViewModel>(data,
        new JsonSerializerSettings
        {
            DateTimeZoneHandling = DateTimeZoneHandling.Local,
            DateFormatHandling = DateFormatHandling.IsoDateFormat
        });

如果数据包含空值(序列化为“NaN”),则会失败,如下所示:

"MyField":"NaN"

没有空值,它工作正常。

我尝试将 NullValueHandling = NullValueHandling.Include/Ignore 添加到序列化程序设置中,均未成功。

【问题讨论】:

  • 你的 ViewModel 类是什么样的?
  • 那不发送NaN怎么样?这似乎是明智的解决方案,而不是试图处理它们。
  • 嗨大卫,我试过这个,不知何故没有工作,将再次尝试使其工作
  • 为什么将 null 值序列化为 NaN 而不是 null?
  • 另外,这是您需要的吗? Removing NaN values in deserialization Web API 2 C#.

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


【解决方案1】:

我通过在淘汰赛字符串化器中添加一个小的 replacer function 解决了这个问题(正如 DavidG 所建议的那样 - 谢谢,我应该从一开始就完成这项工作)。

var data = ko.toJSON(viewModel, function (key, value) { 
    if (value == "NaN") {
        return;
    }
    else {
        return value;
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多