Извлечение значений из JSON с использованием target-c - PullRequest
5 голосов
/ 21 августа 2011

В настоящее время я пытаюсь работать с json и target-c, но у меня возникли некоторые сложности.Ниже приводится возвращаемый json

{
    sethostname =     (
    {
        msgs = "Updating Apache configuration\nUpdating cPanel license...Done. Update succeeded.\nBuilding global cache for cpanel...Done";
        status = 1;
        statusmsg = "Hostname Changed to: a.host.name.com";
        warns =             (
        );
    });
}

Я могу проверить, что ответ возвращается, и ключ имеет имя_хоста, однако, что бы я ни пытался, я не могу получить, например, значение статуса илиstatusmsg.Может кто-нибудь указать мне в нужном месте.Ниже приведен основной код, который я использую для проверки того, что sethostname возвращается.

NSError *myError = nil;
NSDictionary *res = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&myError];
NSLog([res description]);
NSArray *arr;
arr = [res allKeys];
if ([arr containsObject:@"sethostname"])
{
    NSLog(@"worked");
}

Ответы [ 3 ]

11 голосов
/ 21 августа 2011

Если сомневаетесь, запишите структуру ваших данных JSON.Например:

{
    sethostname =     (
    {
        msgs = "Updating Apache configuration\nUpdating cPanel license...Done. Update succeeded.\nBuilding global cache for cpanel...Done";
        status = 1;
        statusmsg = "Hostname Changed to: a.host.name.com";
        warns =             (
        );
    });
}

(в действительности, в формате списка свойств NeXTSTEP) означает, что у вас есть словарь верхнего уровня.Этот словарь верхнего уровня содержит ключ с именем sethostname, значением которого является массив.Этот массив состоит из словарей, каждый словарь имеет набор ключей: msgs, status, statusmsg, warns.msgs имеет строковое значение, status имеет числовое значение, statusmsg имеет строковое значение , warns` имеет значение массива:

dictionary (top-level)
    sethostname (array of dictionaries)
        dictionary (array element)
            msgs (string)
            status (number)
            statusmsg (string)
            warns (array)
                ??? (array element)

Поняв эту структуру, ваш код долженвыглядеть так:

NSError *myError = nil;
NSDictionary *res = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&myError];

if (!res) { // JSON parser failed }

// dictionary (top-level)
if (![res isKindOfClass:[NSDictionary class]]) {
    // JSON parser hasn't returned a dictionary
}

// sethostname (array of dictionaries)
NSArray *setHostNames = [res objectForKey:@"sethostname"];

// dictionary (array element)
for (NSDictionary *setHostName in setHostNames) {
    // status (number)
    NSNumber *status = [setHostName objectForKey:@"status"];

    // statusmsg (string)
    NSString *statusmsg = [setHostName objectForKey:@"statusmsg"];

    …
}
1 голос
/ 21 августа 2011

Почему бы не использовать самый простой метод JSON - [myString jsonValue];

Он является частью этой среды JSON для target-c

0 голосов
/ 21 августа 2011

Я не думаю, что if ([arr containsObject:@"sethostname"]) будет работать, потому что массив результатов не будет содержать этот точный объект. Он может содержать объект с таким же содержимым, но не будет ОДНИМ ЖЕ объектом.

Как писал jtbandes, вам нужно регистрировать фактический вывод. NSLog и res и arr и посмотрите, что у вас есть.

...