2017-07-18 38 views
0

我想构建属性列表,包括json对象的属性路径。从JSON对象构建一个属性列表c#

我不知道JSON或可能存在的键的结构。我在各级按键(而不是那些键的值)之后。

{ 
    "Primitive_1": "T1", 
    "Object_L1": { 
    "Object_L2": { 
     "Object_L3": { 
     "Object_L4": { 
      "Object_L5": { 
      "Object_L6": { 
       "Array_L7": [ 
       { 
        "asdasdas": "SampleText1", 
        "WIDTH": "Width2" 
       }, 
       { 
        "gh45gdfg": "SampleText2", 
        "WIDTH": "Width" 
       } 
       ], 
       "12836hasvdkl": "SampleText3", 
       "WIDTH": "Width" 
      } 
      } 
     }, 
     "712bedfabsmdo98": "SampleText4", 
     "WIDTH": "Width" 
     } 
    }, 
    "ALIAS_ID": 1 
    }, 
    "Primitive_2": "T2", 
    "Primitive_3": "T3", 
    "Primitive_4": "T4" 
} 

所需的输出:

.Primitive_1 .Object_L1.Object_L2.Object_L3.Object_L4.Object_L5.Object_L6.Array_L7.0.asdasdas 
.Object_L1.Object_L2.Object_L3.Object_L4.Object_L5.Object_L6.Array_L7.0.WIDTH 
.Object_L1.Object_L2.Object_L3.Object_L4.Object_L5.Object_L6.Array_L7.1.gh45gdfg 
.Object_L1.Object_L2.Object_L3.Object_L4.Object_L5.Object_L6.Array_L7.1.WIDTH 
.Object_L1.Object_L2.Object_L3.Object_L4.Object_L5.Object_L6.12836hasvdkl 
.Object_L1.Object_L2.Object_L3.Object_L4.Object_L5.Object_L6.WIDTH 
.Object_L1.Object_L2.Object_L3.712bedfabsmdo98 
.Object_L1.Object_L2.Object_L3.WIDTH 
.Object_L1.ALIAS_ID 
.Primitive_2 
.Primitive_3 
.Primitive_4 

已经环顾四周,就物体的根节点我已经得到了。看到小提琴(https://dotnetfiddle.net/wIl1Qw

这似乎是相对简单的JS(http://jsfiddle.net/alteraki/bt3zc1wt/)我已经审查了几个响应,我无法找到答案在C#中解决这个问题,而不知道使用的键(我不知道)

任何帮助将不胜感激。

+0

NO FIDDLES在问题中发布您的代码。也看看这里:http://json2csharp.com/ – EpicKip

+0

你需要[使用递归](https://dotnetfiddle.net/b5AsCs)。 – Phylogenesis

+0

@Phylogenesis - 你是一个拯救生命的人!你能发表一个答案,然后我可以接受吗? – alteraki

回答

2

树遍历算法本质上几乎总是递归的。

因此,下面的函数你想要做什么:可here

private static IEnumerable<string> GetMembers(JToken jToken) 
{ 
    var members = new List<string>(); 

    if (jToken is JObject) 
    { 
     var jObject = (JObject)jToken; 

     foreach (var prop in jObject.Properties()) 
     { 
      if (prop.Value is JValue) 
      { 
       members.Add(prop.Name); 
      } 
      else 
      { 
       members.AddRange(GetMembers(prop.Value).Select(member => prop.Name + "." + member)); 
      } 
     } 
    } 
    else if (jToken is JArray) 
    { 
     var jArray = (JArray)jToken; 

     for (var i = 0; i < jArray.Count; i++) 
     { 
      var token = jArray[i]; 

      members.AddRange(GetMembers(token).Select(member => i + "." + member)); 
     } 
    } 

    return members; 
} 

代码运行的一个例子。

相关问题