【问题标题】:WebAPI - Array of Objects not deserializing correctly on server sideWebAPI - 在服务器端未正确反序列化的对象数组
【发布时间】:2015-09-16 03:13:54
【问题描述】:

在客户端,我使用 AngularJS,而在服务器端,我使用 ASP.NET WebAPI。

我有两个视图模型,ProductCriteriaViewModelSimpleDisplayFieldViewModel

public class ProductCriteriaViewModel
{
    public int ID { get; set; }
    public int? UserSearchID { get; set; }
    public bool? Enabled { get; set; }
    public SimpleDisplayFieldViewModel Property { get; set; }
    public string Operator { get; set; }
    public string CriteriaValue { get; set; }
}

public class SimpleDisplayFieldViewModel
{
    public string Name { get; set; }
    public string Value { get; set; }
    public string PropertyType { get; set; }
}

在 Angular 中,我使用以下签名向 WebAPI 控制器操作提交 POST 请求:

    public IList<...> FindProducts(List<ProductCriteriaViewModel> criteriaVM, bool userFiltering)
    {
       ...
    }

在测试中,我尝试发送一个 Product Criterias 数组,并检查 Fiddler 以查看该数组在 POST 请求正文中的外观,当它被发送到服务器时。这是数组的样子:

[
{"Enabled":true,
 "Operator":"Less than",
 "Property":
     {"$id":"2",                
      "Name":"Copyright Year",
      "Value":"Basic",
      "PropertyType":null},
 "CriteriaValue":"2013",
 "IsNew":true},

{"Enabled":true,
"Operator":"Greater Than",
"Property":
    {"$id":"2",               
     "Name":"Copyright Year",
     "Value":"Basic",
     "PropertyType":null},
"CriteriaValue":"1988",
"IsNew":true}
]

上面的数组有正确的值,但是服务器端反序列化的结果不正确。这就是奇怪的地方。

服务器反序列化数组并到达控制器动作后,criteriaVM中的第一个元素是正确的,所有的值都设置正确。但是第二个元素不正确,CriteriaValueProperty 被清空:

仅当我为多个条件(即版权 1988)选择相同搜索属性时,才会出现此问题。但是,如果我选择不同的属性(即版权 20),则生成的 criteriaVM 中的所有元素都会正确初始化。

我不明白是什么导致了这个问题。为什么 List 的第二个元素中只有 CriteriaValueProperty 设置为 null?为什么仅当我选择多个相同的搜索属性时才会出现此问题?

【问题讨论】:

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


    【解决方案1】:

    Json.NET 使用关键字 $id 和 $ref 来保留对象引用,因此您在反序列化时遇到问题,因为您的 JSON 在“Property”对象中有“$id”。有关对象引用的更多信息,请参阅此链接 information

    为了解决您的反序列化问题,您可以在 WebApiConfig.cs 类的 Register 方法中添加以下行

    config.Formatters.JsonFormatter.SerializerSettings.MetadataPropertyHandling = MetadataPropertyHandling.Ignore;
    

    如果您的 Web Api 项目不包含 WebApiConfig.cs 类,只需在 Global.asax 中添加配置:

    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.MetadataPropertyHandling = MetadataPropertyHandling.Ignore;
    

    现在您在 web api 方法中的对象应该如下所示:

    【讨论】:

    • 优秀。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多