【问题标题】:Finding a node using Json.Net through Linq for inserting a child node or deleting it通过 Linq 使用 Json.Net 查找节点以插入或删除子节点
【发布时间】:2016-11-22 03:52:38
【问题描述】:

我对 Json 数据有这种格式:

{
    "Name": "MainMenu",
    "Text": "",
    "Guid": "047bf56e75f44c14b56a4b84f3af6dbe",
    "ParentGuid": "00000000000000000000000000000000"
    "MenuEntries": [{
            "Name": "Home",
            "Text": "Home",
            "Guid": "1e3df5fb3d8e463b8f37e8ccdb291802",
            "ParentGuid": "047bf56e75f44c14b56a4b84f3af6dbe",
            "MenuEntries": [{
                    "Name": "About",
                    "Text": "About",
                    "Guid": "f476a3444e2943668d86433f4c88374c",
                    "ParentGuid": "1e3df5fb3d8e463b8f37e8ccdb291802",
                    "MenuEntries": []
                }, {
                    "Name": "Contact",
                    "Text": "Contact Us",
                    "Guid": "51b461ec6abd4aecb95cf662e8e15ae6",
                    "ParentGuid": "1e3df5fb3d8e463b8f37e8ccdb291802",
                    "MenuEntries": []
                }
            ]
        }, {
            "Name": "About",
            "Text": "About",
            "Guid": "6954d6f747ef4d2dae33de0f0efae9cc",
            "ParentGuid": "047bf56e75f44c14b56a4b84f3af6dbe",
            "MenuEntries": []
        }, {
            "Name": "Contact",
            "Text": "Contact Us",
            "Guid": "634cfb99b70b4395b94061ae4f082aba",
            "ParentGuid": "047bf56e75f44c14b56a4b84f3af6dbe",
            "MenuEntries": []
        }
    ]
}

如何使用'Guid'字段通过Linq找到特定节点进行过滤?

另外如何在选中的节点中添加子节点('MenuEntries')并删除这个节点?

【问题讨论】:

  • 到目前为止你尝试过什么?你用过 Json.Net
  • 我将字符串解析为 JObject 并尝试使用“Where”扩展名,但不知道如何使用它。

标签: c# json linq json.net


【解决方案1】:

你可以创建一个模型:

    public class MenuEntry
    {
        public string Name { get; set; }
        public string Text { get; set; }
        public string Guid { get; set; }
        public string ParentGuid { get; set; }
        public List<object> MenuEntries { get; set; }
    }

    public class RootObject
    {
        public string Name { get; set; }
        public string Text { get; set; }
        public string Guid { get; set; }
        public string ParentGuid { get; set; }
        public List<MenuEntry> MenuEntries { get; set; }
    }

并反序列化它:

string jsonString = System.IO.File.ReadAllText(Server.MapPath("~/json/test.json"));
RootObject Menu = JsonConvert.DeserializeObject<RootObject>(jsonString);

然后您可以像这样在 MenuEntries 中选择节点:

foreach (var item in Menu.MenuEntries)
    {
        if (item.Guid == "1e3df5fb3d8e463b8f37e8ccdb291802")
            {
               Console.WriteLine(item.Name);
               //=> Home
            }
    }

【讨论】:

  • 我尝试了这条路径,但由于某种原因,搜索到的节点没有作为参考返回,而是作为该节点的新副本返回。
  • 这可能适用于 RootObject 的孩子。我已经尝试创建某种递归函数来检查子项的 MenuEntries,但获取的节点不是作为参考返回,而是作为新副本返回。
猜你喜欢
  • 2018-04-19
  • 2012-07-25
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
相关资源
最近更新 更多