Методы Parse и SelectToken класса JObject делают именно то, что вам нужно / нужно.
Библиотеку можно найти здесь: http://json.codeplex.com/releases/view/37810
JObject o = JObject.Parse(@"
{
""method"":""getCommunicationToken"",
""header"":
{
""uuid"":""9B39AAB0-49A6-AC7A-BA74DE9DA66C62B7"",
""clientRevision"":""20100323.02"",
""session"":""c0d3e8b5d661f74c68ad72af17aeb5a1"",
""client"":""gslite""
},
""parameters"":
{
""secretKey"":""d9b687fa10c927f102cde9c085f9377f""
}
}");
string method = (string)o.SelectToken("method");
// contains now 'getCommunicationToken'
string uuid = (string)o.SelectToken("header.uuid");
// contains now '9B39AAB0-49A6-AC7A-BA74DE9DA66C62B7'
Кстати: это не многомерный массив:
j["header"]["uuid"];
Например, вы можете использовать эти индексаторы в словаре со словарями в качестве значений, например:
Dictionary<string, Dictionary<string, string>> j;
Но здесь вы бы просто имели «глубину» двух индексов. Если вам нужна структура данных с индексаторами в этом «стиле зубчатого массива», вы должны написать класс, такой как:
class JaggedDictionary{
private Dictionary<string, string> leafs =
new Dictionary<string, string>();
private Dictionary<string, JaggedDictionary> nodes =
new Dictionary<string, JaggedDictionary>();
public object this[string str]
{
get
{
return nodes.Contains(str) ? nodes[str] :
leafs.Contains(str) ? leafs[str] : null;
}
set
{
// if value is an instance of JaggedDictionary put it in 'nodes',
// if it is a string put it in 'leafs'...
}
}
}