根据文档,JsonReader:
表示提供对序列化 JSON 数据的快速、非缓存、仅向前访问的读取器。
因此,为了在反序列化集合时跳过已删除的项目,您需要将每个集合条目的 JSON 读取到内存中以某种方式检查isDeleted 属性。如果您的集合项目类太重以至于您不想在非绝对需要时创建一个,您可以使用自定义 JsonConverter 将每个条目加载到 JObject 容器中,然后检查 isDeleted:
public class DeletetedItemSkippingCollectionConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(List<T>);
}
public override bool CanWrite { get { return false; } }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var list = (existingValue as List<T>);
if (list == null)
list = new List<T>();
if (reader.TokenType != JsonToken.StartArray)
return list;
while (reader.Read())
{
if (reader.TokenType == JsonToken.EndArray)
break;
var obj = JObject.Load(reader);
var deleted = obj["isDeleted"];
if (deleted != null)
{
if (deleted.Type == JTokenType.Boolean && (bool)deleted)
continue;
}
if (obj != null)
{
list.Add((T)obj.ToObject<T>(serializer));
}
}
return list;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
然后将其应用于您要过滤的任何 List<T> 属性:
[DataContract]
public class RootObject
{
public RootObject()
{
this.ResultList = new List<Item>();
}
[DataMember(Name="results")]
[JsonConverter(typeof(DeletetedItemSkippingCollectionConverter<Item>))]
public List<Item> ResultList { get; set; }
}
或者,您可以将集合中的每个项目加载到其“最终”表示中,检查它是否被删除,如果是,则将其丢弃。假设你的对象都实现了一个接口IsDeleted,你可以这样做:
public interface IIsDeleted
{
bool IsDeleted { get; } // Corresponds it "isDeleted" property in the JSON.
}
public class IsDeletetedItemSkippingCollectionConverter<T> : JsonConverter where T : IIsDeleted
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(List<T>);
}
public override bool CanWrite { get { return false; } }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var list = (existingValue as List<T>);
if (list == null)
list = new List<T>();
if (reader.TokenType != JsonToken.StartArray)
return list;
while (reader.Read())
{
if (reader.TokenType == JsonToken.EndArray)
break;
var obj = serializer.Deserialize<T>(reader);
if (obj == null || obj.IsDeleted)
{
var disposable = obj as IDisposable;
if (disposable != null)
disposable.Dispose();
continue;
}
list.Add(obj);
}
return list;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}