BLOG
FILTROS
TAGS MAIS USADAS
Usando JSON no iOS 5
-
AUTOR
Felipe Barreto
TAGs desenvolvimento, iphone sdk
2 COMENTÁRIOS-
Tweet
Se você precisar fazer parsing de JSON em aplicativos para versões inferiores à 5.0 do iOS, então nós já demos a dica. Agora, se o seu aplicativo depender apenas do iOS 5 ou superior, então sua vida ficou mais simples.
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!
2 COMENTÁRIOs
-
illDev 30/03/2012, 22:13
Estou consumindo um web service com JSON e está dando certo, porém estou com dificuldades para baixar as fotos...elas vêm como um array de binarios e eu preciso salvá-las na pasta da aplicação. Até salva um arquivo na pasta, mas não é uma foto.. To fazendo assim:
(NSString *)caminhoDoArquivoBaixado:(NSString *)arquivoBaixado { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex :0]; NSString * result; result = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", arquivoBaixado]]; NSLog(@"%@", result); return result; }
(void)connectionDidFinishLoading:(NSURLConnection *)connection { NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; [responseData release];
NSDictionary *results = [responseString JSONValue];
NSMutableArray *arrayBytes = [[results valueForKey:@"data"]objectAtIndex:0];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arrayBytes]; NSString *nomeDaFoto = @"yuy"; [data writeToFile:[self caminhoDoArquivoBaixado:nomeDaFoto] atomically:YES];}
-
Felipe Barreto 02/04/2012, 11:46
illDev,
sem ver o JSON fica difícil dar uma posição exata, mas meu palpite é o seguinte.
Dificilmente, o conteudo de um JSON incluirá um array de bytes explícito. O mais provável é que o conteúdo esteja representado em uma string BASE64.
Existem várias referências de Base64 para iPhone na Internet. Nós já escrevemos um post sobre isso: http://mobits.com.br/2009/7/17/base64-encode-decode-para-iphone
Se quiser testar se a imagem está em Base64 mesmo, copie o conteudo que está dentro do JSON e use este site: http://www.motobit.com/util/base64-decoder-encoder.asp
Boa sorte





+55 21 3553-1898