Json возражает против многомерного массива C #? - PullRequest
1 голос
/ 08 апреля 2010

Есть ли способ преобразовать объект Json в многомерный массив C #? Я знаю, что это может быть непрактично, но я не могу потрудиться написать классы и затем десериализовать струны в них.

List<string> ohyeah = (List<string>)JsonConvert.DeserializeObject(g.CommToken);

Возвращает исключение Invalid Cast!

Пример:

{"method":"getCommunicationToken","header":{"uuid":"9B39AAB0-49A6-AC7A-BA74-DE9DA66C62B7","clientRevision":"20100323.02","session":"c0d3e8b5d661f74c68ad72af17aeb5a1","client":"gslite"},"parameters":{"secretKey":"d9b687fa10c927f102cde9c085f9377f"}}

Мне нужно получить что-то подобное:

j["method"]; //This will equal to getCommunicationToken
j["header"]["uuid"]; //This will equal to 9B39AAB0-49A6-AC7A-BA74-DE9DA66C62B7

Мне буквально нужно разобрать объект json в массив.

1 Ответ

3 голосов
/ 08 апреля 2010

Методы 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'...
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...