Newtonsoft.JsonConvert-如何将JavaScript对象反序列化为一个属性为Enum的对象?

时间:2018-10-16 19:57:18

标签: javascript c# angularjs json json.net

尝试使用以下代码时出现错误:

filters.Filters = JsonConvert.DeserializeObject<List<SearchFilterItem>>(customFilterString);

SearchFilterItem是以下类:

public Guid Id { get; set; }
public string ColumnName { get; set; }
public string ColumnDisplayName { get; set; }
public SearchColumnTypes ColumnType { get; set; }  //Character, Numeric, Boolean, Date, DateTime. 
public SearchOperators Operator { get; set; }
public string Value { get; set; }
public string DisplayValue { get; set; }
public string Logic { get; set; } //And / Or

我正在尝试从JavaScript发送以下内容:

if ($.isNumeric($scope.type)) {
    filter = {
        columnDisplayName: 'Type Id',
        columnName: 'LTypeId',
        columnType: parseInt('1'),
        value: $scope.type.toString(),
        displayValue: $scope.type.toString(),
        strOperator: 'Equals', Logic: "AND"
    };

所以,我的问题是如何正确发送C#枚举类型的columnType?

我在运行时遇到此错误:

  

“无法将System.Int64强制转换或转换为Siriusware.Models.Messages.SearchColumnTypes。”} System.Exception {System.ArgumentException

我该怎么办?

2 个答案:

答案 0 :(得分:4)

Newtonsoft.Json中有一个StringEnumConverter属性,它具有确切的用途。 您可以在此处查看相关文档:

https://www.newtonsoft.com/json/help/html/t_newtonsoft_json_converters_stringenumconverter.htm

这是一篇博客文章,提供了有关该主题的有趣输入,例如自定义转换器:

https://bytefish.de/blog/enums_json_net/

答案 1 :(得分:0)

原来是我自己的愚蠢错误。在filterItem类中,列类型是另一个类。在该类中,我们还有一个ColumnType属性,它是一个枚举。因此,一旦我将JavaScript更改为使用columnType:{ColumnType:'Numeric'},它就可以独立工作-无需进行其他更改。我确实要求我的同事也帮我,我们花了大约一个小时或更长时间来追逐它,直到它终于在我身上消失。