从 JSON 中搜索和删除节点
Searching and deleting a node from JSON
JSON正在持有一个数据。
- 我需要删除“id”值与传入值匹配的节点。在下面的代码中
var isRemoved = (dataDeserialized as JArray).Remove(index);
返回 false。节点不会被删除。如何删除节点?
- 属性 名称“id”甚至是动态的。它将被传入。我如何检查 属性 名称以及值(当前)以找到索引?
这是我目前的情况:
var entityJson = @"
[
{
'id': 1,
'code': 'abc1'
},
{
'id': 2,
'code': 'abc2'
}
]".Replace("'", "\"");
var dataDeserialized = JsonConvert.DeserializeObject<dynamic>(entityJson);// DataLoader.DeserializeJson(entityJson, false);
if(dataDeserialized.Count > 0)
{
var key = "id";
var value = "2";
var index = 0;
var isFound = false;
foreach(var d in dataDeserialized)
{
if((string)d.id == value.ToString())
{
isFound = true;
break;
}
index++;
}
if (isFound)
{
var isRemoved = (dataDeserialized as JArray).Remove(index);
if (isRemoved)
{
var setting = new JsonSerializerSettings
{
DateParseHandling = DateParseHandling.None,
};
var resul = JsonConvert.SerializeObject(dataDeserialized, setting);
//var result = JsonHelper.SerializeObject(dataDeserialized);
}
}
}
我也尝试过 jObject,但它给出了一个错误 Error reading JObject from JsonReader. Current JsonReader item is not an object: StartArray. Path '', line 2, position 13
dynamic obj = JObject.Parse(entityJson);
(obj.employees as JArray).RemoveAt(0);
更新#1:上面的#1 对我有用
if(dataDeserialized.Count > 0)
{
var key = "id";
var value = "2";
JArray list = new JArray();
foreach (var d in dataDeserialized)
{
if ((string)d.id != value.ToString())
{
list.Add(d);
}
}
if(list.Count > 0)
{
var result = JsonConvert.SerializeObject(list);
}
}
不过,我该怎么做 #2,检查“密钥”?
如果您不想将此 json 反序列化为强类型对象,我建议使用 JObject
和 JArray
类 来自 Newtonsoft.Json
包,因为它们为此目的更加灵活。
因此您可以使用这样的动态密钥轻松地从 json 中删除节点:
string key = "id";
int id = 2;
var entityJson = @"
[
{
""id"": 1,
""code"": ""abc1""
},
{
""id"": 2,
""code"": ""abc2""
},
{
""id"": 3,
""code"": ""abc3""
}
]";
JArray jarray = JArray.Parse(entityJson);
var item = jarray.Children().Where(i => (int)(i as JObject).GetValue(key) == id).SingleOrDefault();
if (item != null)
{
jarray.Remove(item);
}
var resul = JsonConvert.SerializeObject(jarray);
JSON正在持有一个数据。
- 我需要删除“id”值与传入值匹配的节点。在下面的代码中
var isRemoved = (dataDeserialized as JArray).Remove(index);
返回 false。节点不会被删除。如何删除节点? - 属性 名称“id”甚至是动态的。它将被传入。我如何检查 属性 名称以及值(当前)以找到索引?
这是我目前的情况:
var entityJson = @"
[
{
'id': 1,
'code': 'abc1'
},
{
'id': 2,
'code': 'abc2'
}
]".Replace("'", "\"");
var dataDeserialized = JsonConvert.DeserializeObject<dynamic>(entityJson);// DataLoader.DeserializeJson(entityJson, false);
if(dataDeserialized.Count > 0)
{
var key = "id";
var value = "2";
var index = 0;
var isFound = false;
foreach(var d in dataDeserialized)
{
if((string)d.id == value.ToString())
{
isFound = true;
break;
}
index++;
}
if (isFound)
{
var isRemoved = (dataDeserialized as JArray).Remove(index);
if (isRemoved)
{
var setting = new JsonSerializerSettings
{
DateParseHandling = DateParseHandling.None,
};
var resul = JsonConvert.SerializeObject(dataDeserialized, setting);
//var result = JsonHelper.SerializeObject(dataDeserialized);
}
}
}
我也尝试过 jObject,但它给出了一个错误 Error reading JObject from JsonReader. Current JsonReader item is not an object: StartArray. Path '', line 2, position 13
dynamic obj = JObject.Parse(entityJson);
(obj.employees as JArray).RemoveAt(0);
更新#1:上面的#1 对我有用
if(dataDeserialized.Count > 0)
{
var key = "id";
var value = "2";
JArray list = new JArray();
foreach (var d in dataDeserialized)
{
if ((string)d.id != value.ToString())
{
list.Add(d);
}
}
if(list.Count > 0)
{
var result = JsonConvert.SerializeObject(list);
}
}
不过,我该怎么做 #2,检查“密钥”?
如果您不想将此 json 反序列化为强类型对象,我建议使用 JObject
和 JArray
类 来自 Newtonsoft.Json
包,因为它们为此目的更加灵活。
因此您可以使用这样的动态密钥轻松地从 json 中删除节点:
string key = "id";
int id = 2;
var entityJson = @"
[
{
""id"": 1,
""code"": ""abc1""
},
{
""id"": 2,
""code"": ""abc2""
},
{
""id"": 3,
""code"": ""abc3""
}
]";
JArray jarray = JArray.Parse(entityJson);
var item = jarray.Children().Where(i => (int)(i as JObject).GetValue(key) == id).SingleOrDefault();
if (item != null)
{
jarray.Remove(item);
}
var resul = JsonConvert.SerializeObject(jarray);