假设
Values是a
List<MyObject>,您的
MyObject课程如下所示:
class MyObject{ public string Time { get; set; } public int Level { get; set; }}您可以将所有代码替换为以下代码,以获得所需的结果:
string json = File.ReadAllText(fileName);Values = JToken.Parse(json)["docs"].ToObject<List<MyObject>>();
之所以可行,是因为Json.Net默认会忽略缺少的属性。由于
MyObject该类不包含
_id要反序列化的属性,因此您无需跳过试图将其从JSON中删除的箍。
解释为什么Remove()
不起作用
JToken.Remove()``JToken从其父级中删除一个。
JProperty从父母
JObject中删除子女或
JToken从子女中删除子女是合法的
JArray。但是,您无法从中删除值
JProperty。一个
JProperty必须始终只有一个值。
当您要求时,
token["_id"]可以获取被调用的 值
,而不是其本身。因此,如果尝试调用该值,将会得到一个错误。要使其按照您的方式工作,您需要使用以下代码:
JProperty``_id``JProperty``Remove()``Parent
if (inner["_id"] != null) inner["_id"].Parent.Remove();
这样说:“查找名称为“的属性
_id并给我值。如果存在,请获取该值的父级(属性),然后从其父级(包含
JObject)中删除它”。
一种更直接的方法是使用该
Property()方法直接访问属性。但是,此方法仅在上
JObject不可用
JToken,因此您需要将的声明更改
inner为a
JObject或将其强制转换为:
foreach (JObject inner in token["docs"].Children<JObject>()){ JProperty idProp = inner.Property("_id"); if (idProp != null) idProp.Remove(); ...}最后,如注释中所述,如果您使用的是C#6或更高版本,则可以使用null条件运算符将代码缩短一些:
inner.Property("_id")?.Remove();


