這是很容易的不僅僅是簡單的JSON文本對象工作...
...
class Program
{
static void Main(string[] args)
{
var jsonstring = "{\"text\":\"blah\",\"nodes\":[{\"text\":\"foo\", \"nodes\": []}, {\"text\":\"bar\", \"nodes\": []}, {\"text\":\"foo\", \"nodes\": []}]}";
//This is the root node
var firstLevelNodes = JsonConvert.DeserializeObject<Node>(jsonstring);
//All the nodes in the root nodes node collection
var secondLevelNodes = firstLevelNodes.nodes;
//All of the nodes in the collections of the second level nodes
var thirdLevelNodes = secondLevelNodes.SelectMany(sln => sln.nodes);
Console.WriteLine("First Level Nodes: \n" + JsonConvert.SerializeObject(firstLevelNodes).PrettyPrint());
Console.WriteLine();
Console.WriteLine("Second Level Nodes: \n" + JsonConvert.SerializeObject(secondLevelNodes).PrettyPrint());
Console.WriteLine();
Console.WriteLine("Third Level Nodes: \n" + JsonConvert.SerializeObject(thirdLevelNodes).PrettyPrint());
secondLevelNodes.First().nodes = new List<Node> { new Node { text = "new node" , nodes = new List<Node>() } };
Console.WriteLine();
Console.WriteLine("Third Level Nodes (with new node): \n" + JsonConvert.SerializeObject(thirdLevelNodes).PrettyPrint());
Console.ReadLine();
}
}
public static class JSONExtensions
{
public static string PrettyPrint(this string json)
{
dynamic parsedJson = JsonConvert.DeserializeObject(json);
return JsonConvert.SerializeObject(parsedJson, Formatting.Indented);
}
}
[Serializable]
public class Node
{
public string text { get; set; }
public IEnumerable<Node> nodes { get; set; }
}
OUTPUT:
First Level Nodes:
{
"text": "blah",
"nodes": [
{
"text": "foo",
"nodes": []
},
{
"text": "bar",
"nodes": []
},
{
"text": "foo",
"nodes": []
}
]
}
Second Level Nodes:
[
{
"text": "foo",
"nodes": []
},
{
"text": "bar",
"nodes": []
},
{
"text": "foo",
"nodes": []
}
]
Third Level Nodes:
[]
Third Level Nodes (with new node):
[
{
"text": "new node",
"nodes": []
}
]
編輯:
所以,如果你只想要的第二級節點有文本foo只使用..
var secondLevelFooNodes = secondLevelNodes.Where(sln=>sln.text == "foo");
//then use these nodes
EDIT2:
使用您的實際JSON對象需要一個TreeView類,以及...
class Program
{
static void Main(string[] args)
{
var jsonstring = "{\"treeview\":[{\"text\":\"blah\",\"nodes\":[]},{\"text\":\"blah\",\"nodes\":[]},{\"text\":\"blah\",\"nodes\":[{\"text\":\"blah\",\"nodes\":[{\"text\":\"foo\",\"nodes\":[]}]}]},{\"text\":\"blah\",\"nodes\":[]},{\"text\":\"foo\",\"nodes\":[]}]}";
//This is the root node
var treeView = JsonConvert.DeserializeObject<TreeView>(jsonstring);
//All the nodes in the root nodes node collection
var firstLevelNodes = treeView.treeview;
//All of the nodes in the collections of the first level nodes
var secondLevelNodes = firstLevelNodes.SelectMany(fln => fln.nodes);
//All of the nodes in the collections of the second level nodes
var thirdLevelNodes = secondLevelNodes.SelectMany(sln => sln.nodes);
Console.WriteLine("The TreeView: \n" + JsonConvert.SerializeObject(treeView, Formatting.Indented));
thirdLevelNodes.First(sln => sln.text == "foo").nodes = new List<Node> { new Node { text = "new node", nodes = new List<Node>() } };
Console.WriteLine();
Console.WriteLine("The TreeView (with new node): \n" + JsonConvert.SerializeObject(treeView, Formatting.Indented));
Console.ReadLine();
}
}
[Serializable]
public class Node
{
public string text { get; set; }
public IEnumerable<Node> nodes { get; set; }
}
[Serializable]
public class TreeView
{
public IEnumerable<Node> treeview { get; set; }
}
OUTPUT:
The TreeView:
{
"treeview": [
{
"text": "blah",
"nodes": []
},
{
"text": "blah",
"nodes": []
},
{
"text": "blah",
"nodes": [
{
"text": "blah",
"nodes": [
{
"text": "foo",
"nodes": []
}
]
}
]
},
{
"text": "blah",
"nodes": []
},
{
"text": "foo",
"nodes": []
}
]
}
The TreeView (with new node):
{
"treeview": [
{
"text": "blah",
"nodes": []
},
{
"text": "blah",
"nodes": []
},
{
"text": "blah",
"nodes": [
{
"text": "blah",
"nodes": [
{
"text": "foo",
"nodes": [
{
"text": "new node",
"nodes": []
}
]
}
]
}
]
},
{
"text": "blah",
"nodes": []
},
{
"text": "foo",
"nodes": []
}
]
}
你可以把它反序列化類,並把它,是這種方法好了嗎? – mybirthname
不,這是不好的,實際上我生成這個JSON,我需要把數據放在「節點」元素,我在第2級,「文本」等於「富」... – Thomas