c#解析轻松的json以生成树

c#解析轻松的json以生成树,c#,json,regex,validation,tree,C#,Json,Regex,Validation,Tree,因此,我需要解析类似以下内容的文件: { pl: { GENERIC: { BACK: "COFNIJ", WAIT: "CZEKAJ", PAGES: { ABOUTME: { ID: "ID", }, INFO: { STATUS: "STATUS", } }

因此,我需要解析类似以下内容的文件:

{
pl: {
    GENERIC: {
        BACK: "COFNIJ",
        WAIT: "CZEKAJ",

        PAGES: {
            ABOUTME: {
                ID: "ID",
            },
            INFO: {
                STATUS: "STATUS",
            }
        }
    },

    TOP_MENU: {
        LOGGED: "Zalogowany",
        OPTIONS: "Opcje",
    }
},

en: {
    GENERIC: {
        BACK: "BACK",
        WAIT: "WAIT",

        PAGES: {
            ABOUTME: {
                ID: "ID",
            },
            INFO: {
                STATUS: "STATUS",
            }
        }
    },

    TOP_MENU: {
        LOGGED: "Logged",
        OPTIONS: "Options",
    }
}
}

但我不知道该文件将包含多少元素,因此我无法创建类来解析该文件

  • 我的第一个问题是如何用双引号将文件中的“无引号”元素包装在c#中,以使该文件json可解析
  • 如何将上述json文件解析为树数据结构,使其看起来像这样: ,这样我就可以在控制台上输出每个叶节点及其路径,“en”和“pl”子树中的值?
    例如: 路径:generic/back en:“back”pl:“cofnij”
  • 我已经尝试使用
    Dictionary Dictionary=JsonConvert.DeserializeObject(文件)
    为了获得主键,在将上述放松的json转换为有效的json之后,我认为树结构将是更有效的方法。
    
    谢谢你的帮助

    您的第一个问题已在此处提出:

    第二个问题听起来有点像这样:你的第一个问题已经在这里被问过了:

    您可以创建一个动态对象

       dynamic myObj =   JsonConvert.DeserializeObject(json);
       foreach (Newtonsoft.Json.Linq.JProperty jproperty in myObj)
       {
             //..
       }
    
    然后对其进行预处理以创建树结构。这将有助于:

    编辑:

    这是通过迭代属性将反序列化动态转换为树结构的方法:

        public void Convert()
        {
            dynamic myObj = JsonConvert.DeserializeObject(json);
            PrintObject(myObj, 0);
        }
    
        private void PrintObject(JToken token, int depth)
        {
            if (token is JProperty)
            {
                var jProp = (JProperty)token;
                var spacer = string.Join("", Enumerable.Range(0, depth).Select(_ => "\t"));
                var val = jProp.Value is JValue ? ((JValue)jProp.Value).Value : "-";
    
                Console.WriteLine($"{spacer}{jProp.Name}  -> {val}");
    
                foreach (var child in jProp.Children())
                {
                    PrintObject(child, depth + 1);
                }
            }
            else if (token is JObject)
            {
                foreach (var child in ((JObject)token).Children())
                {
                    PrintObject(child, depth + 1);
                }
            }
        }
    

    这里已经提出了您的第一个问题:

    第二个问题听起来有点像这样:你的第一个问题已经在这里被问过了:

    您可以创建一个动态对象

       dynamic myObj =   JsonConvert.DeserializeObject(json);
       foreach (Newtonsoft.Json.Linq.JProperty jproperty in myObj)
       {
             //..
       }
    
    然后对其进行预处理以创建树结构。这将有助于:

    编辑:

    这是通过迭代属性将反序列化动态转换为树结构的方法:

        public void Convert()
        {
            dynamic myObj = JsonConvert.DeserializeObject(json);
            PrintObject(myObj, 0);
        }
    
        private void PrintObject(JToken token, int depth)
        {
            if (token is JProperty)
            {
                var jProp = (JProperty)token;
                var spacer = string.Join("", Enumerable.Range(0, depth).Select(_ => "\t"));
                var val = jProp.Value is JValue ? ((JValue)jProp.Value).Value : "-";
    
                Console.WriteLine($"{spacer}{jProp.Name}  -> {val}");
    
                foreach (var child in jProp.Children())
                {
                    PrintObject(child, depth + 1);
                }
            }
            else if (token is JObject)
            {
                foreach (var child in ((JObject)token).Children())
                {
                    PrintObject(child, depth + 1);
                }
            }
        }
    

    你在创作过程中有什么影响吗?因为
    pl
    en
    都有一点……让我们说是蹩脚的、设计不太好的JSON。如果没有这个属性,例如一个包含此信息的属性,那么就更容易了。否:/此JavaScript文件来自角度:/您在创建过程中有任何影响吗?因为
    pl
    en
    都有一点……让我们说是蹩脚的、设计不太好的JSON。如果没有这个属性,比如一个包含这个信息的属性,那么就更容易了。不:/这个JavaScript文件来自angular:/Ye,就是这样!非常感谢!是的,就是这样!非常感谢!