如何使用 SwiftyJSON(在 Swift 中)基于 JSON 对象数组创建对象数组?

Posted

技术标签:

【中文标题】如何使用 SwiftyJSON(在 Swift 中)基于 JSON 对象数组创建对象数组?【英文标题】:How do I create an array of objects based on array of JSON objects using SwiftyJSON (in Swift)? 【发布时间】:2016-07-24 07:57:19 【问题描述】:

这是我从服务器获取的 JSON:


    "items": [
        
            "name": "Shampoo",
            "price": 9
        ,
        ...
    ]

这是我在 Swift 中的 Item 类:

class Item 
    var name: String
    var price: Float
    init(name: String, price: Float) 
        self.name = name
        self.price = price
    

我想使用 SwiftyJSON 为 items 数组中的每个 JSON 对象创建一个 Item 对象。所以我想我只是循环遍历 SwiftyJSON 将为我创建的 Swift 数组,瞧。但是 SwiftyJSON 会抛出一个错误,说 items 不是数组。我尝试将它作为字典下标,但你不能(我认为你可以)在 for 循环中遍历字典。

这是我尝试过的代码:

let json = JSON(data: data) // data is the JSON from the server (above) and isn't nil
let items = json["items"].array // this is nil and where SwiftyJSON throws the error.
// error checking and optional unwrapping etc.
for item in items 
    var itemsList: [Item] = []
    itemsList.append(Item(name: item["name"], price: item["price"]))

我觉得这应该很容易,所以如果有人能找到我出错的地方,我会非常感激。谢谢!

【问题讨论】:

尝试打印json["items"]看看它是什么? @kennytm 看起来它是一个元组,原始 JSON 作为字符串和数组,为 nil。 检查原始JSON格式是否正确? 这与我发布的内容相同,因此如果正确,则我的应用程序中的 JSON 是正确的。我觉得它与顶层作为对象而不是数组有关,但我不知道为什么会导致问题。 .arrayValue 正确的吸气剂吗? github.com/SwiftyJSON/SwiftyJSON/blob/master/README.md 【参考方案1】:

查看ObjectMapper,它是另一个用于 swift 的 JSON 解析器库。 它支持开箱即用的映射数组。

只需声明您的服务器响应对象,如:

class ServerResponse: Mappable 
    var array: [Item]?

    required init?(_ map: Map) 

    

    // Mappable
    func mapping(map: Map) 
        array       <- map["items"]
    

【讨论】:

这真的很酷,但在我的问题解决之前我不能真正使用它,因为我无法从 SwiftyJSON 访问数据,因为当我尝试从我的 JSON 创建数组时它返回错误数组。 它是 SwiftyJSON 的替代品,你应该改用它【参考方案2】:

这就是我在项目中的做法...

guard let cityName = json["city"]["name"].string else return
guard let cityID = json["city"]["id"].int else return

var allForecasts = [Forecast]()
guard let allStuff = json["list"].array else return

      for f in allStuff 
          guard let date = f["dt"].double else continue
          let dateUnix = NSDate(timeIntervalSince1970: date)
          guard let temp = f["main"]["temp"].double else continue
          guard let tempMin = f["main"]["temp_min"].double else continue
          guard let tempMax = f["main"]["temp_max"].double else continue
          guard let pressure = f["main"]["pressure"].double else continue
          guard let humidity = f["main"]["humidity"].double else continue
          guard let description = f["weather"][0]["description"].string else continue
          guard let icon = f["weather"][0]["icon"].string else continue
          guard let wind = f["wind"]["speed"].double else continue

     let weather = Forecast(temperature: temp, maximum: tempMax, minimum: tempMin, description: description, icon: icon, humidity: humidity, pressure: pressure, wind: wind, date: dateUnix)

     allForecasts.append(weather)
     

let fullWeather = City(cityID: cityID, cityName: cityName, forecasts: allForecasts)

我认为这很有帮助。

【讨论】:

你能添加你正在解析的 JSON 吗? api.openweathermap.org/data/2.5/… 这是链接并将其粘贴到 jsonLint 中,您可以看到 json 的样子。

以上是关于如何使用 SwiftyJSON(在 Swift 中)基于 JSON 对象数组创建对象数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift中使用alamofire和swiftyjson解析分页url?

如何使用 SwiftyJSON(在 Swift 中)基于 JSON 对象数组创建对象数组?

如何在 Swift 3.0 中使用 SwiftyJSON 将 JSON 数据分配给 UILabel?

Alamofire 4 请求返回 NSArray,无法弄清楚如何在 Swift 3 中使用 SwiftyJSON 进行解析

swift、Alamofire、SwiftyJSON:如何解析 arrayObject

如何在我的 Swift XCode 应用程序上设置 SwiftyJSON?