【问题标题】:how can i get data from nested arrays through JSONDecoder() [closed]如何通过 JSONDecoder() 从嵌套数组中获取数据 [关闭]
【发布时间】:2020-06-16 17:59:30
【问题描述】:

我在我的项目中遇到了一个问题,基本上我想打印工作列表,用户可以在其中看到可用的工作,并显示每个工作所需的技能(经验标签) 这是我的 json 结果

{
"message": "candidate job listing",
"status": true,
"data": [
    {
        "id": 1,
        "company_name_shown_job": "xyz company",
        "job_title": "Android Developer",
        "job_description": null,
        "experience_tags": [
            {
                "id": 2,
                "employer_job_post_id": 1,
                "experience_in": "Android"

            },
            {
                "id": 3,
                "employer_job_post_id": 1,
                "experience_in": "Php"

            }
        ]
    },
    {
        "id": 2,
        "company_name_shown_job": "Abc company",
        "job_title": "Web Developer",
        "job_description": "<p>Lorem ipsum dolor sit amet,laborum.</p>",
        "experience_tags": [
            {
                "id": 4,
                "employer_job_post_id": 2,
                "experience_in": "Swift"

            },
            {
                "id": 5,
                "employer_job_post_id": 2,
                "experience_in": "Java"

            }
        ]
    }
]

}

我无法获得经验标签

【问题讨论】:

  • 您的JSON 似乎无效。您确定这是您要解码的JSON 吗?尝试在此处验证JSON jsonlint.com
  • 你创建了结构模型吗?也许您可以分享一些代码,以便我们指出您的错误。另外,正如@Frankenstein 所说,您的 JSON 无效。您的 experience_tags 中有一个额外的逗号。数组的最后一个元素后面不应有逗号。
  • 是的,我通过这个json4swift.com 网站创建了模态

标签: ios json swift jsondecoder json-serialization


【解决方案1】:

由于您似乎已将JSON 更新为有效结构,您现在应该错误地解码JSON。这是成功解码此JSON 所需的模型和解码技术。

型号:

struct Response: Codable {
    let message: String
    let status: Bool
    let data: [Job]
}

struct Job: Codable {
    let id: Int
    let companyNameShownJob, jobTitle: String
    let jobDescription: String?
    let experienceTags: [ExperienceTag]

    enum CodingKeys: String, CodingKey {
        case id
        case companyNameShownJob = "company_name_shown_job"
        case jobTitle = "job_title"
        case jobDescription = "job_description"
        case experienceTags = "experience_tags"
    }
}

struct ExperienceTag: Codable {
    let id, employerJobPostID: Int
    let experienceIn: String

    enum CodingKeys: String, CodingKey {
        case id
        case employerJobPostID = "employer_job_post_id"
        case experienceIn = "experience_in"
    }
}

解码:

do {
    let response = try JSONDecoder().decode(Response.self, from: data)
    for job in response.data {
        for experienceTag in job.experienceTags {
            print(experienceTag)
        }
    }
} catch {
    print(error)
}

【讨论】:

  • 兄弟模式不是问题。问题是我使用数据数组来显示工作列表和经验标签基本上是我的结构表视图中特定工作的技能显示数据数组,并且在同一个表视图中有动态经验标签的集合视图。我能够在 tableview 中获取数据
  • 让 products = 试试 JSONDecoder().decode(joblisting_modal.self, from: data) self.jobs_array = products.data!我做了同样的事情,但想像这样在单独的数组中获取标签 let productsa = try JSONDecoder().decode(job_Data.self, from: products.data) self.experience_array = productsa.experience_tags!
  • 您需要像我上面所做的那样使用 for 循环来循环数据。
【解决方案2】:

我为你修正了错误。正如我所说,你的 experience_tags 数组中有一个额外的逗号:

{
    "message": "candidate job listing",
    "status": true,
    "data": [
        {
            "id": 1,
            "company_name_shown_job": "xyz company",
            "job_title": "Android Developer",
            "job_description": null,
            "experience_tags": [
                {
                    "id": 2,
                    "employer_job_post_id": 1,
                    "experience_in": "Android"
    
                },
                {
                    "id": 3,
                    "employer_job_post_id": 1,
                    "experience_in": "Php"
    
                }
            ]
        },
        {
            "id": 2,
            "company_name_shown_job": "Abc company",
            "job_title": "Web Developer",
            "job_description": "<p>Lorem ipsum dolor sit amet,laborum.</p>",
            "experience_tags": [
                {
                    "id": 4,
                    "employer_job_post_id": 2,
                    "experience_in": "Swift"
    
                },
                {
                    "id": 5,
                    "employer_job_post_id": 2,
                    "experience_in": "Java"
    
                }
            ]
        }
    ]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 2019-08-20
    • 2022-09-24
    • 2012-07-18
    • 2018-10-15
    • 1970-01-01
    相关资源
    最近更新 更多