BLOG

Acompanhe a Mobits pelo RSS

FILTROS

03 Fev, 2012  21:27

Usando JSON no iOS 5

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!

COMPARTILHE

2 COMENTÁRIOs

  1. 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];
      

      }

  2. 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

DEIXE UM COMENTÁRIO

If you can read this, you don't use a typical webbrowser that plays nice with CSS.
Please do not fill in anything here!