Разбор вложенных объектов JSON с помощью JSON Framework для Objective-C - PullRequest
6 голосов
/ 10 марта 2010

У меня есть следующий объект JSON:

{
"response": {
    "status": 200
},
"messages": [
    {
        "message": {
            "user": "value"
            "pass": "value",
            "url": "value"
         }
 ]
    }

}

Я использую JSON-Framework (также пробовал JSON Touch), чтобы разобраться в этом и создать словарь. Я хочу получить доступ к блоку "message" и вытащить значения "user", "pass" и "url".

В Obj-C у меня есть следующий код:

// Create new SBJSON parser object
SBJSON *parser = [[SBJSON alloc] init];

// Prepare URL request to download statuses from Twitter
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:myURL]]; 

// Perform request and get JSON back as a NSData object
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

// Get JSON as a NSString from NSData response
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];

//Print contents of json-string
NSArray *statuses = [parser objectWithString:json_string error:nil];
NSLog(@"Array Contents: %@", [statuses valueForKey:@"messages"]);
NSLog(@"Array Count: %d", [statuses count]);


NSDictionary *results = [json_string JSONValue];
NSArray *tweets = [[results objectForKey:@"messages"] objectForKey:@"message"];

for (NSDictionary *tweet in tweets)
{
    NSString *url = [tweet objectForKey:@"url"];
    NSLog(@"url is: %@",url);
}

Я могу извлечь "сообщения" и увидеть все блоки "сообщений", но я не могу разобрать глубже и вытащить "пользователь", "пароль" и "URL".

Ответы [ 3 ]

9 голосов
/ 25 марта 2010

Решено:

NSArray *tweets = [[results objectForKey:@"messages"] valueForKey:@"message"];
6 голосов
/ 10 марта 2010
Array({

  0=>Dictionary({

      response =  Array({

        0=>Dictionary(Status = 200)

      })

    }),

  1=>Dictionary({

      messages = Array({

        0=> Dictionary({

          message = Array({

            0=>Dictionary({

              user = value,

              pass=value,

                 url=value

            })

          })

        })

      })

  })

})

Итак, чтобы получить доступ к словарю для пользователя, pass, url,

nsarray *arr = jsonmainarray;


arr = [[[jsonmainarray objectAtIndex: 1] objectforkey:@"messages"] objectatindex: 0];



nsdictionary *dict = [arr objectatindex: 0];

arr = [dict objectforkey:@"message"];

dict = [arr objectatindex: 0]; // Dictionary with user, pass, url
2 голосов
/ 09 декабря 2010

есть более простой способ (на мой взгляд) для анализа JSON:)

- (void)loadJSONData:(NSString *)u{
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://expandurl.appspot.com/expand?url=%@", u]];
    NSData *rawJsonData = [NSData dataWithContentsOfURL:url];

    CJSONDeserializer *parser = [CJSONDeserializer new];
    NSError *error;
    NSDictionary *jsonDictionary = [parser deserializeAsDictionary:rawJsonData error:&error];

    [parser release];

    NSArray *array = [jsonDictionary objectForKey:@"urls"]; 
}

Все, что вам нужно сделать, это использовать JSON Touch ... как упомянул Шихан Алам.

Скажите, что вы получили эту строку данных JSON:

{ "end_url" = "http://www.youtube.com"; перенаправления = 0; "start_url" = "http://www.youtube.com"; статус = ОК; URL = ( «http://www.youtube.com" ); }

затем в вашем JSONDictonary данные можно получить, выполнив:

[jsonDictionary objectForKey:@"urls"]; //This will return an Array since URLS is a array
[jsondictionary objectForKey:@"en_url"]; //this will return an NSString since end_url is a string

Надеюсь, это поможет людям так же, как и мне =)

искренне ваш Kristian

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...