如何使用 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 进行解析