【问题标题】:Swift - How to get to Specific Value in nested JSON arraySwift - 如何在嵌套 JSON 数组中获取特定值
【发布时间】:2021-04-20 18:23:05
【问题描述】:

我试图在我突出显示的嵌套 JSON 中获取“图像”值字符串(事件/表演者/图像)

{
   "events":[
      {
         "type":"minor_league_baseball",
         "id":4997345,
         "datetime_utc":"2021-04-20T07:30:00",
         "venue":{
            "state":"FL",
            "name_v2":"Joker Marchant Stadium",
            "postal_code":"33805",
            "name":"Joker Marchant Stadium",
            "links":[
               
            ],
            "timezone":"America\/New_York",
            "url":"https:\/\/seatgeek.com\/venues\/joker-marchant-stadium\/tickets",
            "score":0.689039,
            "location":{
               "lat":28.0739,
               "lon":-81.9533
            },
            "address":"2301 Lakeland Hills Blvd.",
            "country":"US",
            "has_upcoming_events":true,
            "num_upcoming_events":43,
            "city":"Lakeland",
            "slug":"joker-marchant-stadium",
            "extended_address":"Lakeland, FL 33805",
            "id":3929,
            "popularity":0,
            "access_method":null,
            "metro_code":539,
            "capacity":8500,
            "display_location":"Lakeland, FL"
         },
         "datetime_tbd":true,
         "performers":[
            {
               "type":"minor_league_baseball",
               "name":"Lakeland Flying Tigers",
               "image":"https:\/\/seatgeek.com\/images\/performers-landscape\/lakeland-flying-tigers-a24bed\/9431\/huge.jpg",
               "id":9431,
               "images":{
                  "huge":"https:\/\/seatgeek.com\/images\/performers-landscape\/lakeland-flying-tigers-a24bed\/9431\/huge.jpg"
               },

我在这里有我的结构,但是一旦我尝试从“表演者”转到“ImageLink/image”,我的主 ViewController 中就会出现(类型为“[ImageLink]”的值没有成员“图像”)错误

import Foundation

struct Entry: Codable {
    let events: [EventsData]
}

struct EventsData: Codable {
    let type: String
    let id: Int
    let title: String
    let venue: locationInfo
    let performers: [ImageLink]
}

struct ImageLink: Codable {
    let image: String
}

struct locationInfo: Codable {
    let display_location: String!
//    let state: String
//    let name_v2: String
}

当我试图获取特定的图像字符串值时,我收到错误('[ImageLink]' 类型的值没有成员'image')。

import UIKit

类视图控制器:UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    
    
    if let url = URL(string:"https://api.seatgeek.com/2/events?client_id=MjE3NTI2Nzd8MTYxODg1NzkwOS44ODcxODE4") {
        URLSession.shared.dataTask(with: url) { data, response, error in
            
            if let data = data {
                let jsonDecoder = JSONDecoder()
                    do {
                        let parsedJSON = try jsonDecoder.decode(Entry.self, from: data)
                        
                        for entryData in parsedJSON.events {
                            print(entryData.performers.image)
                            print(entryData.id)
                            print(entryData.title)
                            print(entryData.venue.display_location+"\n")
                        }
                        
                    } catch {
                        print(error)
                    }
            }
       }.resume()
    }
}

}

我是 JSON 新手,对于新手问题,我深表歉意 :) 提前感谢任何可以帮助我理解如何做到这一点的人。

编辑工作:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        if let url = URL(string:"https://api.seatgeek.com/2/events?client_id=MjE3NTI2Nzd8MTYxODg1NzkwOS44ODcxODE4") {
            URLSession.shared.dataTask(with: url) { data, response, error in
                
                if let data = data {
                    let jsonDecoder = JSONDecoder()
                        do {
                            let parsedJSON = try jsonDecoder.decode(Entry.self, from: data)
                            
                            for entryData in parsedJSON.events {
                                print(entryData.id)
                                print(entryData.title)
                                print(entryData.venue.display_location+"\n")
                                print(entryData.performers.first!.image)
                            }
                            
                        } catch {
                            print(error)
                        }
                }
           }.resume()
        }
    }
}

【问题讨论】:

  • performers 是一个包含五个键的字典数组。

标签: json swift xcode parsing


【解决方案1】:

performers也是一个数组(注意[]),你必须使用两个循环

for entryData in parsedJSON.events {
    for performer in entryData.performers {
        print(performer.image)
    }                        
}

或者如果只有一项

for entryData in parsedJSON.events {
    print(entryData.performers.first?.image)                      
}

【讨论】:

  • 我明白你的意思。我编辑了该代码的文本。因为我成功打印了我需要的所有其他数据。那么我是否必须为我的“performer.image”数据创建一个单独的循环?
  • 是的,你必须这样做。
  • 谢谢。有效。什么和如何?我只需要添加“print(entryData.performers.first?.image)”。你能解释一下“first”是什么吗?是为了什么?
  • 看来我不必添加 2 个循环,而只需添加我在上面编辑的“print(entryData.performers.first?.image)”。你能解释一下吗?
  • 这个名字暗示它是什么。 first 获取数组的第一项。如果有更多,它们将被丢弃。问号是为了安全,因为数组可能为空
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
相关资源
最近更新 更多