Eu tenho uma string JSON (do PHP json_encode()
que se parece com isso:
[{"id": "1", "name":"Aaa"}, {"id": "2", "name":"Bbb"}]
Quero analisar isso em algum tipo de estrutura de dados para o meu aplicativo para iPhone. Eu acho que a melhor coisa para mim seria ter uma matriz de dicionários, então o elemento 0 da matriz é um dicionário com chaves "id" => "1"
e "name" => "Aaa"
.
Eu não entendo como as NSJSONSerialization
lojas armazenam os dados. Aqui esta o meu codigo ate agora:
NSError *e = nil;
NSDictionary *JSON = [NSJSONSerialization
JSONObjectWithData: data
options: NSJSONReadingMutableContainers
error: &e];
Isso é apenas algo que eu vi como exemplo em outro site. Eu tenho tentado ler o JSON
objeto imprimindo o número de elementos e coisas assim, mas estou sempre conseguindo EXC_BAD_ACCESS
.
Como uso NSJSONSerialization
para analisar o JSON acima e transformá-lo na estrutura de dados que mencionei?
ios
objective-c
json
nsdictionary
Logan Serman
fonte
fonte
Respostas:
Seu objeto json raiz não é um dicionário, mas uma matriz:
Isso pode lhe dar uma imagem clara de como lidar com isso:
fonte
[JSON count]
retornar algo em vez de apenas me dar EXC_BAD_ACCESS?!jsonArray
e imprimi o erro. Isso deve exibir qualquer erro que ocorreu durante a análise.jsonArray
deve ser autorelease.Este é o meu código para verificar se o json recebido é uma matriz ou dicionário:
Eu tentei isso para opções: kNilOptions e NSJSONReadingMutableContainers e funciona corretamente para ambos.
Obviamente, o código real não pode ser assim onde eu crio o ponteiro NSArray ou NSDictionary dentro do bloco if-else.
fonte
Funciona para mim. Seu
data
objeto é provavelmentenil
e, como observou o rckoenes, o objeto raiz deve ser uma matriz (mutável). Veja este código:(Eu tive que escapar das aspas na string JSON com barras invertidas.)
fonte
Seu código parece bom, exceto que o resultado é um
NSArray
, não umNSDictionary
, aqui está um exemplo:As duas primeiras linhas apenas criam um objeto de dados com o JSON, o mesmo que você obteria lendo na rede.
Conteúdo do NSLog (uma lista de dicionários):
fonte
NSJSONReadingMutableLeaves
ocorrência no Google:: "Especifica que as seqüências de folhas no gráfico de objeto JSON são criadas como instâncias do NSMutableString."NSJSONReadingMutableContainers
:: "Especifica que matrizes e dicionários são criados como objetos mutáveis".Nos dados JSON acima, você está mostrando que temos uma matriz que contém o número de dicionários.
Você precisa usar este código para analisá-lo:
Para rápido 3/3 +
fonte
O código a seguir busca um objeto JSON de um servidor da web e o analisa em um NSDictionary. Eu usei a API openweathermap que retorna uma resposta JSON simples para este exemplo. Para simplificar, esse código usa solicitações síncronas.
fonte
O @rckoenes já mostrou como obter seus dados corretamente a partir da string JSON.
Para a pergunta que você fez:
EXC_BAD_ACCESS
quase sempre ocorre quando você tenta acessar um objeto depois que ele é [auto-] liberado. Isso não é específico da serialização JSON [des], mas, ao contrário, apenas tem a ver com a obtenção de um objeto e o acesso a ele após o lançamento. O fato de ter vindo via JSON não importa.Existem muitas páginas descrevendo como depurar isso - você deseja o Google (ou SO)
obj-c zombie objects
e, em particularNSZombieEnabled
, o que será inestimável para ajudar a determinar a origem dos seus objetos zumbis. ("Zumbi" é o que se chama quando você libera um objeto, mas mantém um ponteiro para ele e tenta fazer referência mais tarde.)fonte
Swift 2.0 no Xcode 7 (Beta) com bloco do / try / catch:
fonte
NOTA: Para o Swift 3 . Sua string JSON está retornando matriz em vez de dicionário. Por favor, tente o seguinte:
fonte
fonte
O problema parece ser com a liberação automática de objetos. NSJSONSerialization JSONObjectWithData está obviamente criando alguns objetos liberados automaticamente e passando-os de volta para você. Se você tentar levar isso para um segmento diferente, ele não funcionará, pois não pode ser desalocado em um segmento diferente.
O truque pode ser tentar fazer uma cópia mutável desse dicionário ou matriz e usá-lo.
Tratar um NSDictionary como NSArray não resultará em exceção de acesso incorreto, mas provavelmente travará quando uma chamada de método for feita.
Além disso, talvez as opções não sejam realmente importantes aqui, mas é melhor fornecer NSJSONReadingMutableContainers | NSJSONReadingMutableContainers | NSJSONReadingAllowFragments, mas mesmo que sejam objetos liberados automaticamente, ele pode não resolver esse problema.
fonte
exemplo ruim, deve ser algo como este {"id": 1, "name": "something as name"}
número e string são misturados.
fonte