从 JSON 中搜索和删除节点

Searching and deleting a node from JSON

JSON正在持有一个数据。

  1. 我需要删除“id”值与传入值匹配的节点。在下面的代码中 var isRemoved = (dataDeserialized as JArray).Remove(index); 返回 false。节点不会被删除。如何删除节点?
  2. 属性 名称“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 反序列化为强类型对象,我建议使用 JObjectJArray 类 来自 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);