【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),如有轉載請標明出處,不甚感激!!!