c# - Json空数组在MVC中反序列化为null

我有一个 Controller Action ,它接收一个整数和一个对象,其中包含各种属性,其中之一是对象的通用列表。当我使用填充列表将 JSON 发布到操作时,所有内容都正确映射,并且我得到一个包含我发布的对象的列表。但是,如果数组为空,则 MVC 操作将属性绑定(bind)到空列表而不是空列表。我希望空数组映射到一个空数组而不是 null,因为在这种情况下,空数组意味着集合中没有任何内容,而 null 意味着应该检查数据库以查看以前是否有任何内容保存在集合中,但我不知道需要更改什么才能使其正确映射。我们正在使用 Json.Net 对返回对象进行对象序列化,但我认为它不会用于模型绑定(bind)上的对象反序列化。

正在传递的对象:

public class ObjectInList
{
    public decimal Value1 { get; set; }
    public decimal Value2 { get; set; }
}

public class Criteria
{
    public decimal? ANullableNumber { get; set; }
    public IList<ObjectInList> ObjectsList { get; set; }
}

Json 请求: "{\"id\":137,\"criteria\":{\"ObjectsList\":[]}}"

Controller Action :

public ActionResult ProcessCriteria(int id, Criteria criteria)
{
    return Json(_service.ProcessCriteria(id, criteria));
}

在 Controller 操作中,我在标准对象中得到一个空列表而不是一个空列表。无论我是否为其他属性发送空值,都会发生这种情况。不确定是否归结为对象是 IList 而不是 IEnumerable? (包装服务调用的 Json 方法是我们使用 Json.Net 返回 json 结果以序列化响应的包装器 - null 在接收到的条件对象中,而不是在返回中。)

我猜我错过了一些非常简单的东西,但我无法弄清楚是什么,非常感谢任何帮助。

最佳答案

好的,我在将近 5 个小时的时间里遇到了这个问题,试图找到解决方案 然后我发现自己正在查看 MVC 源代码。 我发现这是 System.Web.Mvc.ValueProviderResult 中的 Mvc 源代码的问题 在第 173 行:

        else if (valueAsArray != null)
        {
            // case 3: destination type is single element but source is array, so                     extract first element + convert
            if (valueAsArray.Length > 0)
            {
                value = valueAsArray.GetValue(0);
                return ConvertSimpleType(culture, value, destinationType);
            }
            else
            {
                // case 3(a): source is empty array, so can't perform conversion
                return null;
            }
        }

如你所见,如果 source 为空数组,它将返回 null。

所以我必须想办法解决它,然后我才想起过去我们是如何进行反序列化的: 这就是你得到你想要的东西的方式:

    public ActionResult ProcessCriteria(int id, Criteria criteria)
    {
        var ser = new System.Web.Script.Serialization.JavaScriptSerializer();
        StreamReader reader = new StreamReader(System.Web.HttpContext.Current.Request.InputStream);
        reader.BaseStream.Position = 0;
        criteria = ser.Deserialize<Criteria>(reader.ReadToEnd());

        return Json(_service.ProcessCriteria(id, criteria));
    }

https://stackoverflow.com/questions/14478793/

相关文章:

javascript - 通过 AJAX 和 jQuery 从 PHP 数组中获取数据

javascript - 无法重新初始化 JQuery DataTable

ruby-on-rails - 为什么在 Ubuntu 中安装 JSON gem 时会出错?

javascript - 如何处理奇怪组合的 websocket 消息?

c# - WebApi Put如何从指定的属性中告诉未指定的属性设置为null?

c# - 如何使用 C#/LINQ 将 XML 转换为 JSON?

java - jackson 在通用列表中读取 json

c# - 分配给单个属性的多个 JsonProperty 名称

eclipse - Jersey :找不到 Java 类和 MIME 媒体类型应用程序/json 的

c# - 使用注释将嵌套的 JSON 结构反序列化为使用 Json.NET 的扁平类