Estou realmente lutando para tentar ler um arquivo JSON no Swift para que eu possa brincar com ele. Passei a maior parte de 2 dias pesquisando e tentando métodos diferentes, mas ainda não tive sorte, então me inscrevi no StackOverFlow para ver se alguém pode me apontar na direção certa .....
Meu arquivo JSON é chamado test.json e contém o seguinte:
{
"person":[
{
"name": "Bob",
"age": "16",
"employed": "No"
},
{
"name": "Vinny",
"age": "56",
"employed": "Yes"
}
]
}
O arquivo é armazenado nos documentos diretamente e eu o acesso usando o seguinte código:
let file = "test.json"
let dirs : String[] = NSSearchPathForDirectoriesInDomains(
NSSearchpathDirectory.DocumentDirectory,
NSSearchPathDomainMask.AllDomainMask,
true) as String[]
if (dirs != nil) {
let directories: String[] = dirs
let dir = directories[0]
let path = dir.stringByAppendingPathComponent(file)
}
var jsonData = NSData(contentsOfFile:path, options: nil, error: nil)
println("jsonData \(jsonData)" // This prints what looks to be JSON encoded data.
var jsonDict = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: nil) as? NSDictionary
println("jsonDict \(jsonDict)") - This prints nil.....
Se alguém puder me dar um empurrão na direção certa sobre como eu posso desserializar o arquivo JSON e colocá-lo em um objeto Swift acessível, serei eternamente grato!
Atenciosamente,
Krivvenz.
path
é visível apenas noif
escopo e não é resolvido quando você o usaNSData(contentsOfFile, options, error)
; você também tem erros de digitação nos nomes de enumeração.Respostas:
Siga o código abaixo:
A matriz "pessoas" conterá todos os dados da pessoa-chave. Faça iterações para buscá-lo.
Swift 4.0:
fonte
Se alguém estiver procurando por SwiftyJSON Answer:
Update:
For
Swift 3/4
:fonte
url(forResource
em(NS)Bundle
evitar o passo extra para criar o URLSwift 4 usando Decodable
Swift 3
fonte
O Xcode 8 Swift 3 leu o json da atualização do arquivo:
fonte
Nomes atualizados para o Swift 3.0
Com base na resposta de Abhishek e resposta de Druva
fonte
Simplificando o exemplo fornecido por Peter Kreinz. Funciona com o Swift 4.2.
A função de extensão:
O modelo de exemplo:
O exemplo de uso:
O exemplo também funcionará com matrizes:
Observe como não fornecemos genéricos desnecessários, portanto, não precisamos converter o resultado da análise.
fonte
Resposta Swift 2.1 (baseada em Abhishek):
fonte
Resultado:
fonte
Isso funcionou muito bem comigo
fonte
Aqui está a minha solução usando SwiftyJSON
fonte
Copy🏻 Solução independente de estrutura de terceiros pronta para copiar e colar.
uso 👇🏻
let json:[[String : AnyObject]] = loadJSON(name: "Stations")!
fonte
Estou fornecendo outra resposta, porque nenhuma delas aqui é voltada para carregar o recurso do pacote de teste. Se você estiver consumindo um serviço remoto que lança JSON e deseja testar a unidade analisando os resultados sem atingir o serviço real, você recebe uma ou mais respostas e as coloca em arquivos na pasta Testes em seu projeto.
Isso também usa o SwiftyJSON, mas a lógica principal de obter o pacote de teste e carregar o arquivo é a resposta para a pergunta.
fonte
Swift 4: experimente minha solução:
fonte
fromJSON
função de extensão é lançada, mas no exemplo você a chama sem atry
palavra - chave. Este código não será compilado.fromJSON
você usar uma extensão Decodable, você não usa nenhuma informação do tipo Decodable, mas fornece genéricos adicionais (completamente inúteis).O mais recente swift 3.0 absolutamente funcionando
fonte
Swift 4
JSON
paraClass
comDecodable
- para quem prefere aulasDefina as classes da seguinte maneira:
Uso, bastante abstrato:
Isso permite que métodos para classes
People
ePerson
classes, variáveis (atributos) e métodos também possam ser marcados comoprivate
se necessário.fonte
O código a seguir funciona para mim. Estou usando o Swift 5
Então, se sua Person Struct (ou Classe) for Decodable (e também todas as suas propriedades), você pode simplesmente fazer:
Evitei todo o código de manipulação de erros para torná-lo mais legível.
fonte
Atualizado para Swift 3 com a maneira mais segura
fonte
Swift 5.1, Xcode 11
Você pode usar isto:
fonte
Com base na resposta de Abhishek , para o iOS 8, seria:
fonte
Isso funcionou para mim com o XCode 8.3.3
fonte
Swift 4.1 Atualizado Xcode 9.2
fonte
NSData
no Swift 3+ e.allowFragments
é inútil neste caso.fonte
Usei o código abaixo para buscar o JSON do arquivo FAQ-data.json presente no diretório do projeto.
Estou implementando no Xcode 7.3 usando o Swift.
Estrutura do arquivo JSON:
fonte
Também posso recomendar o Swift JSON Tutorial de Ray Wenderlich (que também aborda a incrível alternativa SwiftyJSON, Gloss ). Um trecho (que, por si só, não responde totalmente ao pôster, mas o valor agregado dessa resposta é o link, portanto, não há -1 para isso, por favor):
Obviamente, no XCode 8.x, basta tocar duas vezes na barra de espaço e dizer "Ei, Siri, desserialize esse JSON para mim no Swift 3.0 com recuos de espaço / tabulação".
fonte
SWIFTYJSON VERSÃO SWIFT 3
fonte
Primeiro, crie um Struc codificável como este:
Agora declare a variável
Ler do diretório principal
Leia da Web
fonte
Use esta função genérica
com esta linha de código:
para este tipo:
fonte