【发布时间】:2013-09-06 22:41:00
【问题描述】:
我在使用 JSON.NET 反序列化某些数据时遇到问题。以下字符串虽然通过 JSON.NET 序列化,但不会正确反序列化。
{"ParentClause":null,"FilterClauseType":2,"FilterClause":[ {"FilterClauseType":1,"FilterClauses":[],"ComparisonType":2,"FieldStaticName":"ContentType","Value":"Hidden","FieldValueType":2}, {"FilterClauseType":1,"FilterClauses":[],"ComparisonType":1,"FieldStaticName":"ContentType","Value":"Document","FieldValueType":2}], "ComparisonType":null,"FieldStaticName":null,"Value":null,"FieldValueType":null}
执行JsonConvert.DeserializeObject() 会跳过FilterClauses 数组的元素,即使它们明显存在。无论我使用方法的泛型还是非泛型重载,都会发生这种情况。
这是一个错误,还是有什么方法可以解决这个问题?我尝试实现自定义JsonConverter,但传入的JReader 会引发异常。
作为参考,这是类定义:
class FilterClause
{
public FilterClause ParentClause {get; set;}
public FilterClauseType FilterClauseType {get; set;}
public IList<FilterClause> FilterClauses {get; set;}
public ComparisonType? ComparisonType {get; set;}
public String FieldStaticName {get; set;}
public String Value {get; set;}
public FieldValueType? FieldValueType {get; set;}
public FilterClause()
{
FilterClauses = ImmutableList.Create<FilterClause>();
}
}
【问题讨论】:
-
您的构造函数似乎正在创建一个 ImmutableList。假设该实例实际上是不可变的,但仍实现了 IList
,则反序列化器可能正在为每个项目调用 .Add,然后您的不可变列表类将忽略这些项目(因为如果不是,它就不是不可变的)。从构造函数中删除该行,然后重试。 -
这没关系,因为即使我尝试反序列化为匿名对象(显然不会使用
ImmutableList)时,它也不起作用