【问题标题】:Searching and deleting a node from JSON从 JSON 中搜索和删除节点
【发布时间】:2021-06-16 17:39:29
【问题描述】:

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

标签: c# json json.net


【解决方案1】:

如果您不想将此 json 反序列化为强类型对象,我建议您使用 Newtonsoft.Json 包中的 JObjectJArray 类,因为它们对于此目的更加灵活。

因此,您可以使用如下动态键轻松地从 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);

【讨论】:

    猜你喜欢
    • 2019-04-11
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多