【发布时间】:2021-06-16 17:39:29
【问题描述】:
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 吗?如果是这样,为什么?至于“删除”的问题,我强烈建议你创建一个代表结构的类而不是使用动态的,这样你就可以轻松地使用 LINQ 过滤原始集合并重新序列化
-
我会得到一个json文件的路径,它就像一个存储库。代码需要在任何 json 文件上运行。键和值也将被传入。我不能用它创建一个类。