在 json - swift 中返回的错误解码数组
error decoding array that was returned in json - swift
当尝试解码对象数组 "arquivo" 的 return 时,始终为 nil
import UIKit
struct pessoa: Codable {
let idPessoa: Int
let nome: String
let cpf: String
let email: String
let dtaNascimento: String
let dtaCadastro: String
let telefone: String
let status: Int
}
struct arquivo: Codable {
let idArquivo: Int
let caminho: String
let nome: String
let descricao: String
let tamanho: Double
let idPessoa: Int
let idOcorrencia: Int
enum CodingKeys: String, CodingKey {
case idArquivo
case caminho
case nome
case descricao
case tamanho
case idPessoa
case idOcorrencia
}
}
struct PessoaDTO: Codable {
let pessoa: pessoa!
let arquivo: Array<arquivo>!
enum CodingKeys: String, CodingKey {
case pessoa = "pessoa"
case arquivo = "arquivo"
}
}
var json = """
{
"pessoa":
{
"idPessoa": 89,
"nome": "Arnaldo",
"cpf": "816.404.648-44",
"email": "testeocorrenciabus@google.com",
"dtaNascimento": "1969-01-01T03:00:00.000+0000",
"dtaCadastro": "2019-10-30T18:53:19.000+0000",
"telefone": "(54)58648-4464",
"status": 1,
"arquivo": [
{ "idArquivo": 91,
"caminho": "/images/u/1572461505454.jpg",
"nome": "1572461505454.jpg",
"descricao": "",
"tamanho": 31765,
"idPessoa": 89,
"idOcorrencia": 1
}
]
}
}
"""
do {
let decodedBeerObject = try JSONDecoder().decode(PessoaDTO.self, from: json.data(using: .utf8)!)
print(decodedBeerObject.pessoa)
print(decodedBeerObject.arquivo)
} catch let error {
print(error.localizedDescription)
}
结果:
Optional(__lldb_expr_51.pessoa(idPessoa: 89, nome: "Arnaldo", cpf:
"816.404.648-44", email: "testeocorrenciabus@google.com",
dtaNascimento: "1969-01-01T03:00:00.000+0000", dtaCadastro:
"2019-10-30T18:53:19.000+0000", telefone: "(54)58648-4464", status:
1)) nil
您的模型不正确
arquivo
存在于pessoa
内部,不在同一级别。
正确的解析代码是:
struct Pessoa: Codable {
let idPessoa: Int
let nome: String
let cpf: String
let email: String
let dtaNascimento: String
let dtaCadastro: String
let telefone: String
let status: Int
let arquivo: Array<Arquivo>!
}
struct Arquivo: Codable {
let idArquivo: Int
let caminho: String
let nome: String
let descricao: String
let tamanho: Double
let idPessoa: Int
let idOcorrencia: Int
}
struct PessoaDTO: Codable {
let pessoa: Pessoa!
}
var json123 = """
{
"pessoa":
{
"idPessoa": 89,
"nome": "Arnaldo",
"cpf": "816.404.648-44",
"email": "testeocorrenciabus@google.com",
"dtaNascimento": "1969-01-01T03:00:00.000+0000",
"dtaCadastro": "2019-10-30T18:53:19.000+0000",
"telefone": "(54)58648-4464",
"status": 1,
"arquivo": [
{ "idArquivo": 91,
"caminho": "/images/u/1572461505454.jpg",
"nome": "1572461505454.jpg",
"descricao": "",
"tamanho": 31765,
"idPessoa": 89,
"idOcorrencia": 1
}
]
}
}
"""
do {
let decodedBeerObject = try JSONDecoder().decode(PessoaDTO.self, from: json123.data(using: .utf8)!)
print(decodedBeerObject.pessoa)
print(decodedBeerObject.pessoa.arquivo)
} catch let error {
print(error.localizedDescription)
}
你的结构有点错误,关键 arquivo
是 Pessoa
的一部分
struct Pessoa: Codable {
let idPessoa: Int
let nome: String
let cpf: String
let email: String
let arquivo: [Arquivo]
let dtaNascimento: String
let dtaCadastro: String
let telefone: String
let status: Int
}
struct Arquivo: Codable {
let idArquivo: Int
let caminho: String
let nome: String
let descricao: String
let tamanho: Double
let idPessoa: Int
let idOcorrencia: Int
}
struct PessoaDTO: Codable {
let pessoa: Pessoa
}
如果键的名称和结构成员匹配,则不需要编码键
要得到 真实 错误总是只打印 error
实例
catch {
print(error)
}
并且请以首字母大写命名结构。
并且永远不要将Codable
上下文中的结构成员声明为隐式解包可选。
当尝试解码对象数组 "arquivo" 的 return 时,始终为 nil
import UIKit
struct pessoa: Codable {
let idPessoa: Int
let nome: String
let cpf: String
let email: String
let dtaNascimento: String
let dtaCadastro: String
let telefone: String
let status: Int
}
struct arquivo: Codable {
let idArquivo: Int
let caminho: String
let nome: String
let descricao: String
let tamanho: Double
let idPessoa: Int
let idOcorrencia: Int
enum CodingKeys: String, CodingKey {
case idArquivo
case caminho
case nome
case descricao
case tamanho
case idPessoa
case idOcorrencia
}
}
struct PessoaDTO: Codable {
let pessoa: pessoa!
let arquivo: Array<arquivo>!
enum CodingKeys: String, CodingKey {
case pessoa = "pessoa"
case arquivo = "arquivo"
}
}
var json = """
{
"pessoa":
{
"idPessoa": 89,
"nome": "Arnaldo",
"cpf": "816.404.648-44",
"email": "testeocorrenciabus@google.com",
"dtaNascimento": "1969-01-01T03:00:00.000+0000",
"dtaCadastro": "2019-10-30T18:53:19.000+0000",
"telefone": "(54)58648-4464",
"status": 1,
"arquivo": [
{ "idArquivo": 91,
"caminho": "/images/u/1572461505454.jpg",
"nome": "1572461505454.jpg",
"descricao": "",
"tamanho": 31765,
"idPessoa": 89,
"idOcorrencia": 1
}
]
}
}
"""
do {
let decodedBeerObject = try JSONDecoder().decode(PessoaDTO.self, from: json.data(using: .utf8)!)
print(decodedBeerObject.pessoa)
print(decodedBeerObject.arquivo)
} catch let error {
print(error.localizedDescription)
}
结果:
Optional(__lldb_expr_51.pessoa(idPessoa: 89, nome: "Arnaldo", cpf: "816.404.648-44", email: "testeocorrenciabus@google.com", dtaNascimento: "1969-01-01T03:00:00.000+0000", dtaCadastro: "2019-10-30T18:53:19.000+0000", telefone: "(54)58648-4464", status: 1)) nil
您的模型不正确
arquivo
存在于pessoa
内部,不在同一级别。
正确的解析代码是:
struct Pessoa: Codable {
let idPessoa: Int
let nome: String
let cpf: String
let email: String
let dtaNascimento: String
let dtaCadastro: String
let telefone: String
let status: Int
let arquivo: Array<Arquivo>!
}
struct Arquivo: Codable {
let idArquivo: Int
let caminho: String
let nome: String
let descricao: String
let tamanho: Double
let idPessoa: Int
let idOcorrencia: Int
}
struct PessoaDTO: Codable {
let pessoa: Pessoa!
}
var json123 = """
{
"pessoa":
{
"idPessoa": 89,
"nome": "Arnaldo",
"cpf": "816.404.648-44",
"email": "testeocorrenciabus@google.com",
"dtaNascimento": "1969-01-01T03:00:00.000+0000",
"dtaCadastro": "2019-10-30T18:53:19.000+0000",
"telefone": "(54)58648-4464",
"status": 1,
"arquivo": [
{ "idArquivo": 91,
"caminho": "/images/u/1572461505454.jpg",
"nome": "1572461505454.jpg",
"descricao": "",
"tamanho": 31765,
"idPessoa": 89,
"idOcorrencia": 1
}
]
}
}
"""
do {
let decodedBeerObject = try JSONDecoder().decode(PessoaDTO.self, from: json123.data(using: .utf8)!)
print(decodedBeerObject.pessoa)
print(decodedBeerObject.pessoa.arquivo)
} catch let error {
print(error.localizedDescription)
}
你的结构有点错误,关键 arquivo
是 Pessoa
struct Pessoa: Codable {
let idPessoa: Int
let nome: String
let cpf: String
let email: String
let arquivo: [Arquivo]
let dtaNascimento: String
let dtaCadastro: String
let telefone: String
let status: Int
}
struct Arquivo: Codable {
let idArquivo: Int
let caminho: String
let nome: String
let descricao: String
let tamanho: Double
let idPessoa: Int
let idOcorrencia: Int
}
struct PessoaDTO: Codable {
let pessoa: Pessoa
}
如果键的名称和结构成员匹配,则不需要编码键
要得到 真实 错误总是只打印 error
实例
catch {
print(error)
}
并且请以首字母大写命名结构。
并且永远不要将Codable
上下文中的结构成员声明为隐式解包可选。