簡體   English   中英

json - swift 中返回的錯誤解碼數組

[英]error decoding array that was returned in json - swift

當試圖解碼對象數組“arquivo”的返回時,總是 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)
}

結果:

可選的(__lldb_expr_51.pessoa(idPessoa:89,名稱:“Arnaldo”,cpf:“816.404.648-44”,email:“testeocorrenciabus@google.com”,dtaNascimento:“1969-01-01T00000+03:0 ", dtaCadastro: "2019-10-30T18:53:19.000+0000", 電話: "(54)58648-4464", 狀態: 1)) 無

您的 Model 不正確

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)
}

您的結構略有錯誤,關鍵arquivoPessoa的一部分

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上下文中的 struct 成員聲明為隱式展開的 optional

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM