c#迭代遍歷帶數組的json格式數據


【1】首先我們先創建一個帶數組形式的json格式的數組

1)我們按照結構定義一個類,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.IO;

namespace ceshi1
{
    class Data
    {
        public string text
        {
            get;
            set;
        }
        public int nodeType
        {
            get;
            set;
        }
        public int nodeID
        {
            get;
            set;
        }
        public bool leaf
        {
            get;
            set;
        }
        public int devicedID
        {
            get;
            set;
        }
        public List<Data> children
        {
            get;
            set;
        }

    }
}

【2】我們來創造生成一個結構

//定義一個數據結構
            Data data = new Data();
            data.nodeType = 1;
            data.nodeID = 10;
            data.leaf = false;
            data.devicedID = 10;
            data.text = "直流監測";
            data.children = new List<Data>(){
                new Data(){
                    nodeType = 11,
                    nodeID = 101,
                    leaf = false,
                    devicedID = 101,
                    text = "廣州局",
                    children = new List<Data>(){
                        new Data(){
                          nodeType = 111,
                          nodeID = 1011,
                          leaf = false,
                          devicedID = 1011,
                          text = "從化站",
                          children = new List<Data>(){
                            new Data(){
                                nodeType = 1111,
                                nodeID = 10111,
                                leaf = true,
                                devicedID = 10111,
                                text = "從化站#1主變",
                                children = new List<Data>(){}
                            },
                            new Data(){
                                nodeType = 1112,
                                nodeID = 10112,
                                leaf = true,
                                devicedID = 10112,
                                text = "從化站#2主變",
                                children = new List<Data>(){}
                            }
                          }
                        },
                        new Data(){
                          nodeType = 112,
                          nodeID = 1012,
                          leaf = false,
                          devicedID = 1012,
                          text = "板橋站",
                          children = new List<Data>(){
                              new Data(){
                                 nodeType = 1121,
                                 nodeID = 10121,
                                 leaf = true,
                                 devicedID = 1021,
                                 text = "板橋站#1主變",
                                 children = new List<Data>(){}
                              }
                          }
                        }
                    }
                },
                new Data(){
                    nodeType = 12,
                    nodeID = 102,
                    leaf = false,
                    devicedID = 102,
                    text = "深圳局",
                    children = new List<Data>(){
                        new Data(){
                            nodeType = 121,
                            nodeID = 1021,
                            leaf = false,
                            devicedID = 1021,
                            text = "福田站",
                            children = new List<Data>(){
                                new Data(){
                                    nodeType = 1211,
                                    nodeID = 10211,
                                    leaf = true,
                                    devicedID = 10211,
                                    text = "板橋站#1主變",
                                    children = new List<Data>(){}
                                }
                            }
                        }
                    }
                },
                new Data(){
                    nodeType = 13,
                    nodeID = 103,
                    leaf = false,
                    devicedID = 103,
                    text = "珠海局",
                    children = new List<Data>(){
                        new Data(){}
                    }
                }
            };

Console.WriteLine(data);

我們打印出來的對象為:ceshi1.Data;它是以一個對象的形式呈現;

【3】我們附加一點字符串/對象/json格式的轉換方法講解

首先引入第三方庫:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

 

<a>將data序列化為json字符串
 string json = JsonConvert.SerializeObject(data);
 Console.WriteLine(json);

打印結果為(字符串):

{"text":"直流監測","nodeType":1,"nodeID":10,"leaf":false,"devicedID":10,"children":[{"text":"廣州局","nodeType":11,"nodeID":101,"leaf":false,"devicedID":101,"children":[{"text":"從化站","nodeType":111,"nodeID":1011,"leaf":false,"devicedID":1011,"children":[{"text":"從化站#1主變","nodeType":1111,"nodeID":10111,"leaf":true,"devicedID":10111,"children":[]},{"text":"從化站#2主變","nodeType":1112,"nodeID":10112,"leaf":true,"devicedID":10112,"children":[]}]},{"text":"板橋站","nodeType":112,"nodeID":1012,"leaf":false,"devicedID":1012,"children":[{"text":"板橋站#1主變","nodeType":1121,"nodeID":10121,"leaf":true,"devicedID":1021,"children":[]}]}]},{"text":"深圳局","nodeType":12,"nodeID":102,"leaf":false,"devicedID":102,"children":[{"text":"福田站","nodeType":121,"nodeID":1021,"leaf":false,"devicedID":1021,"children":[{"text":"板橋站#1主 變","nodeType":1211,"nodeID":10211,"leaf":true,"devicedID":10211,"children":[]}]}]},{"text":"珠海局","nodeType":13,"nodeID":103,"leaf":false,"devicedID":103,"children":[{"text":null,"nodeType":0,"nodeID":0,"leaf":false,"devicedID":0,"children":null}]}]}

 

<b>有序列化,肯定有反序列化,將json反序列化為data,反序列化為對象
Data jsonData = JsonConvert.DeserializeObject<Data>(json);
Console.WriteLine(data);

打印結果為(對象):

ceshi1.Data;

 

<c>將json字符串格式化

JObject jo = (JObject)JsonConvert.DeserializeObject(json);
Console.WriteLine(jo);

打印結果為(json格式):

{
  "text": "直流監測",
  "nodeType": 1,
  "nodeID": 10,
  "leaf": false,
  "devicedID": 10,
  "children": [
    {
      "text": "廣州局",
      "nodeType": 11,
      "nodeID": 101,
      "leaf": false,
      "devicedID": 101,
      "children": [
        {
          "text": "從化站",
          "nodeType": 111,
          "nodeID": 1011,
          "leaf": false,
          "devicedID": 1011,
          "children": [
            {
              "text": "從化站#1主變",
              "nodeType": 1111,
              "nodeID": 10111,
              "leaf": true,
              "devicedID": 10111,
              "children": []
            },
            {
              "text": "從化站#2主變",
              "nodeType": 1112,
              "nodeID": 10112,
              "leaf": true,
              "devicedID": 10112,
              "children": []
            }
          ]
        },
        {
          "text": "板橋站",
          "nodeType": 112,
          "nodeID": 1012,
          "leaf": false,
          "devicedID": 1012,
          "children": [
            {
              "text": "板橋站#1主變",
              "nodeType": 1121,
              "nodeID": 10121,
              "leaf": true,
              "devicedID": 1021,
              "children": []
            }
          ]
        }
      ]
    },
    {
      "text": "深圳局",
      "nodeType": 12,
      "nodeID": 102,
      "leaf": false,
      "devicedID": 102,
      "children": [
        {
          "text": "福田站",
          "nodeType": 121,
          "nodeID": 1021,
          "leaf": false,
          "devicedID": 1021,
          "children": [
            {
              "text": "板橋站#1主變",
              "nodeType": 1211,
              "nodeID": 10211,
              "leaf": true,
              "devicedID": 10211,
              "children": []
            }
          ]
        }
      ]
    },
    {
      "text": "珠海局",
      "nodeType": 13,
      "nodeID": 103,
      "leaf": false,
      "devicedID": 103,
      "children": [
        {
          "text": null,
          "nodeType": 0,
          "nodeID": 0,
          "leaf": false,
          "devicedID": 0,
          "children": null
        }
      ]
    }
  ]
}

到這一步,數據已經生成了,各位看官想要的三種數據形式都已經有了,接下來就是我們的重頭戲了;

 

【4】迭代遍歷取節點

需求:取出最底層的leaf = true或者Children為null的情況的節點所有的nodeType/nodeID/devicedID/text值;並以數組或者list的方式返回

a)下面我們定義一個迭代方法:

public static void FindAll(Data inputData, ref List<Data> data)
        {
            if (inputData.leaf)
            {
                data.Add(inputData);
            }
            else
            {
                if (inputData.children == null) return;
                foreach (var item in inputData.children)
                {
                    if (item.leaf)
                    {
                        data.Add(item);
                    }
                    else
                    {
                        FindAll(item,ref data);
                    }
                }
            }
        } 

b)我們在main函數(或者需要的地方)中調用,加上如下代碼:

   //序列化為json字符串
            string json = JsonConvert.SerializeObject(data);
            //Console.WriteLine(json);

            //反序列化為對象
            Data jsonData = JsonConvert.DeserializeObject<Data>(json);
            //Console.WriteLine(data);

            //json格式化
            JObject jo = (JObject)JsonConvert.DeserializeObject(json);
            //Console.WriteLine(jo);

            //問題:
            //取出最底層的leaf = true或者Children為空的情況的節點所有的nodeType/nodeID/devicedID/text值?
            //需要迭代遍歷?
            var resultData = new List<Data>();
            FindAll(data, ref  resultData);
            Console.ReadKey();

 

 

【5】檢驗是否正確

到這一步,我們基本上已經完成了,我們來測試一下最終的結果,遍歷一下這個返回結果resultData

    for (int i = 0; i < resultData.Count;i++ )
            {
                Console.WriteLine(JsonConvert.SerializeObject(resultData[i]));
            }

輸出結果如下:

{"text":"從化站#1主變","nodeType":1111,"nodeID":10111,"leaf":true,"devicedID":10111,"children":[]}
{"text":"從化站#2主變","nodeType":1112,"nodeID":10112,"leaf":true,"devicedID":10112,"children":[]}
{"text":"板橋站#1主變","nodeType":1121,"nodeID":10121,"leaf":true,"devicedID":1021,"children":[]}
{"text":"板橋站#1主變","nodeType":1211,"nodeID":10211,"leaf":true,"devicedID":10211,"children":[]}

顯然,取出了全部的葉子結點

 

【6】結果源碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.IO;
using System.Data;
using System.Diagnostics;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace ceshi1
{

    class Program
    {
        //public ArrayList al = new ArrayList();
        //public void GetAllDirList(string strBaseDir)
        //{

        //    DirectoryInfo di = new DirectoryInfo(strBaseDir);
        //    DirectoryInfo[] dirA = di.GetDirectories();
        //    for (int i = 0; i < dirA.Length; i++)
        //    {
        //        al.Add(dirA[i].FullName);
        //        Console.WriteLine(dirA[i]);
        //        Console.WriteLine(dirA[i].FullName);
        //        GetAllDirList(dirA[i].FullName);
        //    }
        //}

        static void Main(string[] args)
        {
            //定義一個數據結構
            Data data = new Data();
            data.nodeType = 1;
            data.nodeID = 10;
            data.leaf = false;
            data.devicedID = 10;
            data.text = "直流監測";
            data.children = new List<Data>()
            {
                new Data()
                {
                    nodeType = 11,
                    nodeID = 101,
                    leaf = false,
                    devicedID = 101,
                    text = "廣州局",
                    children = new List<Data>()
                    {
                        new Data()
                        {
                            nodeType = 111,
                            nodeID = 1011,
                            leaf = false,
                            devicedID = 1011,
                            text = "從化站",
                            children = new List<Data>()
                            {
                                new Data()
                                {
                                    nodeType = 1111,
                                    nodeID = 10111,
                                    leaf = true,
                                    devicedID = 10111,
                                    text = "從化站#1主變",
                                    children = new List<Data>() {}
                                },
                                new Data()
                                {
                                    nodeType = 1112,
                                    nodeID = 10112,
                                    leaf = true,
                                    devicedID = 10112,
                                    text = "從化站#2主變",
                                    children = new List<Data>() {}
                                }
                            }
                        },
                        new Data()
                        {
                            nodeType = 112,
                            nodeID = 1012,
                            leaf = false,
                            devicedID = 1012,
                            text = "板橋站",
                            children = new List<Data>()
                            {
                                new Data()
                                {
                                    nodeType = 1121,
                                    nodeID = 10121,
                                    leaf = true,
                                    devicedID = 1021,
                                    text = "板橋站#1主變",
                                    children = new List<Data>() {}
                                }
                            }
                        }
                    }
                },
                new Data()
                {
                    nodeType = 12,
                    nodeID = 102,
                    leaf = false,
                    devicedID = 102,
                    text = "深圳局",
                    children = new List<Data>()
                    {
                        new Data()
                        {
                            nodeType = 121,
                            nodeID = 1021,
                            leaf = false,
                            devicedID = 1021,
                            text = "福田站",
                            children = new List<Data>()
                            {
                                new Data()
                                {
                                    nodeType = 1211,
                                    nodeID = 10211,
                                    leaf = true,
                                    devicedID = 10211,
                                    text = "板橋站#1主變",
                                    children = new List<Data>() {}
                                }
                            }
                        }
                    }
                },
                new Data()
                {
                    nodeType = 13,
                    nodeID = 103,
                    leaf = false,
                    devicedID = 103,
                    text = "珠海局",
                    children = new List<Data>()
                    {
                        new Data() {}
                    }
                }
            };

            //序列化為json字符串
            string json = JsonConvert.SerializeObject(data);
            //Console.WriteLine(json);

            //反序列化為對象
            Data jsonData = JsonConvert.DeserializeObject<Data>(json);
            //Console.WriteLine(data);

            //json格式化
            JObject jo = (JObject)JsonConvert.DeserializeObject(json);
            //Console.WriteLine(jo);

            //問題:
            //取出最底層的leaf = true或者Children為空的情況的節點所有的nodeType/nodeID/devicedID/text值?
            //需要迭代遍歷?
            var resultData = new List<Data>();
            FindAll(data, ref  resultData);
            //Console.WriteLine(resultData);

            for (int i = 0; i < resultData.Count;i++ )
            {
                Console.WriteLine(JsonConvert.SerializeObject(resultData[i]));
            }
            Console.ReadKey();
        }


        public static void FindAll(Data inputData, ref List<Data> data)
        {
            if (inputData.leaf)
            {
                data.Add(inputData);
            }
            else
            {
                if (inputData.children == null) return;
                foreach (var item in inputData.children)
                {
                    if (item.leaf)
                    {
                        data.Add(item);
                    }
                    else
                    {
                        FindAll(item,ref data);
                    }
                }
            }
        }   
}
}

【6】監測過程源碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.IO;
using System.Data;
using System.Diagnostics;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace ceshi1
{

    class Program
    {
        //public ArrayList al = new ArrayList();
        //public void GetAllDirList(string strBaseDir)
        //{

        //    DirectoryInfo di = new DirectoryInfo(strBaseDir);
        //    DirectoryInfo[] dirA = di.GetDirectories();
        //    for (int i = 0; i < dirA.Length; i++)
        //    {
        //        al.Add(dirA[i].FullName);
        //        Console.WriteLine(dirA[i]);
        //        Console.WriteLine(dirA[i].FullName);
        //        GetAllDirList(dirA[i].FullName);
        //    }
        //}

        static void Main(string[] args)
        {
            //定義一個數據結構
            Data data = new Data();
            data.nodeType = 1;
            data.nodeID = 10;
            data.leaf = false;
            data.devicedID = 10;
            data.text = "直流監測";
            data.children = new List<Data>(){
                new Data(){
                    nodeType = 11,
                    nodeID = 101,
                    leaf = false,
                    devicedID = 101,
                    text = "廣州局",
                    children = new List<Data>(){
                        new Data(){
                          nodeType = 111,
                          nodeID = 1011,
                          leaf = false,
                          devicedID = 1011,
                          text = "從化站",
                          children = new List<Data>(){
                            new Data(){
                                nodeType = 1111,
                                nodeID = 10111,
                                leaf = true,
                                devicedID = 10111,
                                text = "從化站#1主變",
                                children = new List<Data>(){}
                            },
                            new Data(){
                                nodeType = 1112,
                                nodeID = 10112,
                                leaf = true,
                                devicedID = 10112,
                                text = "從化站#2主變",
                                children = new List<Data>(){}
                            }
                          }
                        },
                        new Data(){
                          nodeType = 112,
                          nodeID = 1012,
                          leaf = false,
                          devicedID = 1012,
                          text = "板橋站",
                          children = new List<Data>(){
                              new Data(){
                                 nodeType = 1121,
                                 nodeID = 10121,
                                 leaf = true,
                                 devicedID = 1021,
                                 text = "板橋站#1主變",
                                 children = new List<Data>(){}
                              }
                          }
                        }
                    }
                },
                new Data(){
                    nodeType = 12,
                    nodeID = 102,
                    leaf = false,
                    devicedID = 102,
                    text = "深圳局",
                    children = new List<Data>(){
                        new Data(){
                            nodeType = 121,
                            nodeID = 1021,
                            leaf = false,
                            devicedID = 1021,
                            text = "福田站",
                            children = new List<Data>(){
                                new Data(){
                                    nodeType = 1211,
                                    nodeID = 10211,
                                    leaf = true,
                                    devicedID = 10211,
                                    text = "板橋站#1主變",
                                    children = new List<Data>(){}
                                }
                            }
                        }
                    }
                },
                new Data(){
                    nodeType = 13,
                    nodeID = 103,
                    leaf = false,
                    devicedID = 103,
                    text = "珠海局",
                    children = new List<Data>(){
                        new Data(){}
                    }
                }
            };

            //序列化為json字符串
            string json = JsonConvert.SerializeObject(data);
            // Console.WriteLine(json);

            //反序列化為對象
            Data jsonData = JsonConvert.DeserializeObject<Data>(json);
            //取出最底層的leaf = true或者Children為空的情況的節點所有的nodeType/nodeID/devicedID/text值?

            FindAll(jsonData);
            Console.ReadKey();
        }


        public static void FindAll(Data inputData)
        {
            if (inputData.leaf)
            {
                Console.WriteLine("leaf:{0}, nodeType:{1}, nodeID:{2}, devicedID:{3}, text: {4}, children is null:{5}"
                    , inputData.leaf
                    , inputData.nodeType
                    , inputData.nodeID
                    , inputData.devicedID
                    , inputData.text
                    , inputData.children == null);
            }
            else
            {
                if (inputData.children == null) return;
                foreach (var item in inputData.children)
                {
                    if (item.leaf)
                    {
                        Console.WriteLine(
                            "leaf:{0}, nodeType:{1}, nodeID:{2}, devicedID:{3}, text: {4}, children is null:{5}"
                            , item.leaf
                            , item.nodeType
                            , item.nodeID
                            , item.devicedID
                            , item.text
                            , item.children == null);
                        //我想把取出來結果以對象的方式放到數組或者一個List集合里面去,然后再返回這個集合或者數組(最好用數組),謝謝
                        //數組類似於:[{leaf:True, nodeType:1111, nodeID:10111, devicedID:10111, text: 從化站#1主變, children is null:False},{leaf:True, nodeType:1112, nodeID:10112, devicedID:10112, text: 從化站#2主變, children is null:False}]


                    }
                    else
                    {
                        FindAll(item);
                    }
                }
            }
        }
    }
}

本文源於zhuxiaoge(http://www.cnblogs.com/zhuxiaoge/p/7090544.html),如有轉載請標明出處,不甚感激!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM