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),如有转载请标明出处,不甚感激!!!
c#迭代遍历带数组的json格式数据的更多相关文章
- JS学习笔记(3)--json格式数据的添加,删除及排序方法
这篇文章主要介绍了json格式数据的添加,删除及排序方法,结合实例形式分析了针对一维数组与二维数组的json格式数据进行增加.删除与排序的实现技巧,需要的朋友可以参考下 本文实例讲述了json格式 ...
- fastJson在java后台转换json格式数据探究(二)--处理数组/List/Map
作者:buster2014 推荐:长安散人 fastJson在java后台转换json格式数据探究(二)--处理数组/List/Map JSON字符串与Java对象的转换 1.将Java对象或Java ...
- JSon_零基础_002_将List类型数组转换为JSon格式的对象字符串,返回给界面
将List类型数组转换为JSon格式的对象字符串,返回给界面 所需要导入的包: 编写bean: package com.west.webcourse.po; /** * 第01步:编写bean类, * ...
- JSon_零基础_001_将布尔类型数组转换为JSon格式字符串,返回给界面
将布尔类型数组转换为JSon格式字符串,返回给界面 需要导入包: 编写bean: package com.west.webcourse.po; /** * 第01步:编写bean类, * 下一步com ...
- ajax接收遍历处理json格式数据
ajax在前后端的交互中应用非常广泛,通过请求后台接口接收处理json格式数据展现在前端页面. 下面我们来简单用 ajax在本地做一个接收并处理json的小例子 首先我们要新建一个叫做data的jso ...
- Python:numpy数组转换为json格式
在python中,如何将一个numpy数组转换为json格式? 这是最近遇到的一个问题,做个笔记. 假设arr为numpy数组,将其转换为json格式: 总体思想是①首先转换为python的list, ...
- iOS开发之JSON格式数据的生成与解析
本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解: 一.JSON是什么? 二.我们为什么要用JSON格式的数据? 三.如何生成JSON格式的数据? 四.如何解析JSON格式的数据? ...
- 解析json格式数据
实现目标 读取文件中的json格式数据,一行为一条json格式数据.进行解析封装成实体类. 通过google的Gson对象解析json格式数据 我现在解析的json格式数据为: {",&qu ...
- Spring MVC 学习笔记11 —— 后端返回json格式数据
Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...
随机推荐
- Educational Codeforces Round 1 (C) (atan2 + long double | 大数)
这题只能呵呵了. 东搞西搞,折腾快一天,最后用了一个800多行的代码AC了. 好好的题目你卡这种精度干啥. 还有要卡您就多卡点行不,为什么long double 又可以过... 废了N长时间写个了不管 ...
- 【BZOJ3270】博物馆 期望DP+高斯消元
[BZOJ3270]博物馆 Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n ...
- openCV图像形态学
#include <cv.h> #include <highgui.h> #include <stdio.h> //平滑处理 int main() { IplIma ...
- zookeeper(二): Curator vs zkClient
目录 zookeeper Curator zkClient 客户端对比 写在前面 1.1. zookeeper应用开发 1.1.1. ZkClient简介 1.1.2. Curator简介 写在最后 ...
- But what exactly do we mean by "gets closer to"?
https://rdipietro.github.io/friendly-intro-to-cross-entropy-loss/ [将输入转化为输出:概率分布] When we develop a ...
- 我的Android进阶之旅------> Android在TextView中显示图片方法
面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用Tex ...
- Action三种编写方式
1. 创建普通类不实现接口与继承类 2. 实现Action接口 3. 继承ActionSupport类(常用)
- inux c编程:记录锁
记录锁的功能:当一个进程正在读或修改文件的某个部分是,它可以阻止其他进程修改同一文件区.对于这个功能阐述我认为有三点要解释的: 记录锁不仅仅可以用来同步不同进程对同一文件的操作,还可以通过对同一文件加 ...
- SAP初始账号
方法1:有其中某Client的登录帐号1. 用已有帐号登录某个Client2. 运行Tcode SE303. 单击“tips and tricks“按钮4. 在Performance Tips an ...
- (转)基于libRTMP的流媒体直播之 AAC、H264 推送
参考: 1,基于libRTMP的流媒体直播之 AAC.H264 推送 http://billhoo.blog.51cto.com/2337751/1557646