03 Fev, 2012 21:27
Usando JSON no iOS 5
Com a chegada do iOS 5, foi liberada para nós a classe NSJSONSerialization. Não precisa fazer nenhum import especial, pois ela vem no Foundation framework.
O funcionamento é muito semelhante a da solução antiga, ou seja, a partir de um conteúdo JSON, o NSJSONSerialization cria NSArrays, NSDictionaries, NSStrings, NSNumbers e NSNulls.
Supondo que você tenha o JSON abaixo em um NSData (de um arquivo ou baixado de algum site):
[
{
"nome": "Cine Mobits",
"ano_lancamento": 2008,
"ipad": false,
"link": "http://www.cinemobits.com.br"
},
{
"nome": "Mobits Button Soccer",
"ano_lancamento": 2009,
"ipad": false,
"link": "http://www.mobitsbuttonsoccer.com"
},
{
"nome": "The Lost Puzzles",
"ano_lancamento": 2010,
"ipad": false,
"link": "http://www.thelostpuzzles.com"
},
{
"nome": "The Hungry Pets",
"ano_lancamento": 2011,
"ipad": true,
"link": "http://www.thehungrypets.com"
}
]
Fazer o seu parsing é simples:
NSArray *projetosMobits = [NSJSONSerialization JSONObjectWithData:json options:0 error:&erro];
NSDictionary *cineMobits = [projetosMobits objectAtIndex:0];
NSString *nome = [cineMobits objectForKey:@"nome"];
NSInteger *ano_lancamento = [[cineMobits objectForKey:@"ano_lancamento"] intValue];
BOOL *ipad = [[cineMobits objectForKey:@"ipad"] boolValue];
Se você tiver o JSON como um Stream:
NSArray *projetosMobits = [NSJSONSerialization JSONObjectWithStream:jsonStream options:0 error:&erro];
Em ambos os métodos acima, esse parâmetro options aceita uma bitmask com as opções:
- NSJSONReadingMutableContainers: NSArrays e NSDictionaries são recuperados como mutable;
- NSJSONReadingMutableLeaves: Valores NSString são recuperados como mutable;
- NSJSONReadingAllowFragments: Permite que o json não seja apenas um dictionary ou array.
Essa última opção é importante caso o seu JSON possa ser apenas uma string, um número, um booleano, ou até um nulo. Ex:
null
Se NSJSONReadingAllowFragments não for fornecido, o parser reportará um erro e não fará o parsing corretamente.
Até a próxima!