2017-11-09 5 views
0

이 JSON에서 구성 요소의 상태를 찾으려고합니다. C#에서 JSON과 동일한 노드의 다른 키를 사용하여 키 값 찾기

{ 
    "data": { 
     "id": 0, 
     "name": "name1", 
     "childFolders": [ 
      { 
       "id": 60, 
       "name": "name2", 
       "childFolders": [ 
        { 
         "id": 72, 
         "name": "Simulator", 
         "childFolders": [ 
          { 
           "id": 235, 
           "name": "generic data pumper", 
           "childFolders": [], 
           "childComponents": [ 
            { 
             "id": 14, 
             "name": "TCP Client", 
             "state": "ERROR", 
             "type": "COMMUNICATION_POINT", 
             "inboundQueueSize": 0, 
             "outboundQueueSize": 46256 
            }, 
            { 
             "id": 99, 
             "name": "A4_Timer", 
             "state": "STOPPED", 
             "type": "COMMUNICATION_POINT", 
             "inboundQueueSize": 0, 
             "outboundQueueSize": 0 
            }, 
            { 
             "id": 102, 
             "name": "A2_Timer", 
             "state": "STOPPED", 
             "type": "COMMUNICATION_POINT", 
             "inboundQueueSize": 0, 
             "outboundQueueSize": 0 
            }, 
            { 
             "id": 108, 
             "name": "A8_Timer", 
             "state": "STOPPED", 
             "type": "COMMUNICATION_POINT", 
             "inboundQueueSize": 0, 
             "outboundQueueSize": 0 
            }, 
            { 
             "id": 113, 
             "name": "Timer MRO", 
             "state": "RUNNING", 
             "type": "COMMUNICATION_POINT", 
             "inboundQueueSize": 0, 
             "outboundQueueSize": 0 
            }, 
            { 
             "id": 119, 
             "name": "A1_Timer", 
             "state": "STOPPED", 
             "type": "COMMUNICATION_POINT", 
             "inboundQueueSize": 0, 
             "outboundQueueSize": 0 
            }, 
            { 
             "id": 121, 
             "name": "A3_Timer", 
             "state": "STOPPED", 
             "type": "COMMUNICATION_POINT", 
             "inboundQueueSize": 0, 
             "outboundQueueSize": 0 
            }, 
            { 
             "id": 124, 
             "name": "TImer URO", 
             "state": "STOPPED", 
             "type": "COMMUNICATION_POINT", 
             "inboundQueueSize": 0, 
             "outboundQueueSize": 0 
            }, 
            { 
             "id": 236, 
             "name": "Demographics Reporter Generic", 
             "state": "RUNNING", 
             "type": "ROUTE" 
            }, 
            { 
             "id": 299, 
             "name": "TImer for UIS", 
             "state": "STOPPED", 
             "type": "COMMUNICATION_POINT", 
             "inboundQueueSize": 0, 
             "outboundQueueSize": 0 
            } 
           ] 
          } 
         ], 
         "childComponents": [] 
        }, 
        { 
         "id": 920, 
         "name": "Get_JavaScript_Counter_Value", 
         "childFolders": [], 
         "childComponents": [ 
          { 
           "id": 916, 
           "name": "HTTP Server", 
           "state": "RUNNING", 
           "type": "COMMUNICATION_POINT", 
           "inboundQueueSize": 0, 
           "outboundQueueSize": 0 
          }, 
          { 
           "id": 917, 
           "name": "Get_JavaScript_Counter_Value", 
           "state": "RUNNING", 
           "type": "ROUTE" 
          } 
         ] 
        } 
       ], 
       "childComponents": [] 
      } 
     ], 
     "childComponents": [] 
    }, 
    "error": null 
} 

나는 json2sharp.com에서 JSON 클래스를 생성.

public class ChildFolder2 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public List<object> childFolders { get; set; } 
    public List<object> childComponents { get; set; } 
} 

public class ChildFolder 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public List<ChildFolder2> childFolders { get; set; } 
    public List<object> childComponents { get; set; } 
} 

public class Data 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public List<ChildFolder> childFolders { get; set; } 
    public List<object> childComponents { get; set; } 
} 

public class RootObject 
{ 
    public Data data { get; set; } 
    public object error { get; set; } 
} 

JSON은 문자열로 저장됩니다. 나는 JSON.NET을 사용하고있다. 그러나 JSON.NET을 사용하지 않는 모든 솔루션도 유용 할 것입니다. 그럼 구성 요소 이름이 인 경우 해당 구성 요소의 상태을 찾아야합니다. 구성 요소 유형은 "COMMUNICATION_POINT"입니다. 미리 감사드립니다. 모든 클래스의

답변

0

먼저 다음과 같아야합니다

public class Component 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public string state { get; set; } 
    public string type { get; set; } 
    public int inboundQueueSize { get; set; } 
    public int outboundQueueSize { get; set; } 
} 

public class Folder 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public IList<Folder> childFolders { get; set; } 
    public IList<Component> childComponents { get; set; } 
} 

public class Data 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public IList<Folder> childFolders { get; set; } 
    public IList<Component> childComponents { get; set; } 
} 

public class Root 
{ 
    public Data data { get; set; } 
    public object error { get; set; } 
} 

그런 다음 당신은 재귀에 의해 모든 구성 요소를 찾을 수 있습니다

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Console.WriteLine("Hello, world!"); 
     Root r = parse(content); //view JSON.NET or something else 
     List<Component> components = r.data.childComponents.where(c=>!string.IsNullOrEmpty(c.name) && c.type == "COMMUNICATION_POINT").toList(); 
     components.AddRange(r.data.childFolders.Select(ExtractComponentsFromFolers)); 
    } 

     public static List<Component> ExtractComponentsFromFolers(Folder folser) 
     { 
     if (folser == null) return new List<Component>(); 
     List<Component> result = folser.childComponents.where(c=>!string.IsNullOrEmpty(c.name) && c.type == "COMMUNICATION_POINT").toList(); 
     result.AddRange(folser.childFolders.Select(ExtractComponentsFromFolers)); 
     return result; 
     } 

} 

대부분의 아마 당신이 더 NULL 체크 조건을 추가 할 필요가 있지만, 내 생각 그것은 당신이 원하는 것입니다.

+0

'Data' 클래스와 Folder 클래스는 따로 따로 필요하지 않습니다. 루트에서'Folder'를 사용할 수 있습니다 :'public Folder data {get; 세트; }' –

+0

@ Ilya.Sulimanov 솔루션을 가져 주셔서 감사합니다. 나는 그것이 매개 변수로 폴더를 소요 이후 ExtractComponentsFromFolders()에 대한 매개 변수가없는 것 같아요. 특정 폴더를 매개 변수로 어떻게 제공해야합니까 ?? –