arrays - 在 Swift 中解析 json 数组
问题描述
我正在尝试获取一些 json 数据,如下所示:
[
{
"_id": "5ccbf88042b2f60ec690a8dd",
"title": "Conference1",
"description": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.",
"cities": [
{
"name": "Paris",
"numberOfUsers": "3"
},
{
"name": "Marseille",
"numberOfUsers": "7"
},
{
"name": "Lyon",
"numberOfUsers": "2"
}
]
}
{
"_id": "5ccbf88042b2f60ec690a8dd",
"title": "Conference1",
"description": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.",
"cities": [
{
"name": "Paris",
"numberOfUsers": "5"
},
{
"name": "Marseille",
"numberOfUsers": "10"
},
{
"name": "Lyon",
"numberOfUsers": "8"
}
]
}
]
这是我的代码:
class Event: NSObject{
var title: String? = ""
var eventDescription: String? = ""
var cities: [String:String]? = ["":""]
var name: String? = ""
var numberOfUsers: String? = ""
static func parseEventData(data: Data) -> [Event] {
var eventsArray = [Event]()
do {
let jsonResult = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)
//Parse JSON Data
if let events = jsonResult as? [Dictionary<String,AnyObject>] {
for event in events {
let newEvent = Event()
newEvent.title = event["title"] as? String
newEvent.eventDescription = event["description"] as? String
newEvent.cities = event["cities"] as? [String:String]
for city in newEvent.cities? {
newEvent.name = city["name"] as? String
newEvent.numberOfUsers = city["numberOfUsers"] as? String
}
eventsArray.append(newEvent)
}
}
}catch let err {
print(err)
}
return eventsArray
}
}
代码可以很好地编译标题和描述,但我坚持正确捕捉城市。任何帮助,将不胜感激。谢谢
解决方案
正确的 json (你错过了数组元素之间的逗号,
)
[{
"_id": "5ccbf88042b2f60ec690a8dd",
"title": "Conference1",
"description": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.",
"cities": [{
"name": "Paris",
"numberOfUsers": "3"
},
{
"name": "Marseille",
"numberOfUsers": "7"
},
{
"name": "Lyon",
"numberOfUsers": "2"
}
]
},
{
"_id": "5ccbf88042b2f60ec690a8dd",
"title": "Conference1",
"description": "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.",
"cities": [{
"name": "Paris",
"numberOfUsers": "5"
},
{
"name": "Marseille",
"numberOfUsers": "10"
},
{
"name": "Lyon",
"numberOfUsers": "8"
}
]
}
]
`// MARK: - Element
struct Root: Codable {
let id, title, purpleDescription: String
let cities: [City]
enum CodingKeys: String, CodingKey {
case id = "_id"
case title
case purpleDescription = "description"
case cities
}
}
// MARK: - City
struct City: Codable {
let name, numberOfUsers: String
}
let res = try! JSONDecoder().decode([Root].self,from:data)
print(res)
编辑:这里(城市是一个数组)
newEvent.cities = event["cities"] as? [String:String]
应该
newEvent.cities = event["cities"] as? [[String:String]]
do {
let jsonResult = try JSONSerialization.jsonObject(with: data, options:[])
//Parse JSON Data
if let events = jsonResult as? [[String:Any]] {
for event in events {
let newEvent = Event()
newEvent.title = event["title"] as? String
newEvent.eventDescription = event["description"] as? String
newEvent.cities = event["cities"] as? [[String:String]]
for city in newEvent.cities ?? [["no city found": "number of users : 0"]] {
newEvent.name = city["name"] ?? ""
newEvent.numberOfUsers = city["numberOfUsers"] ?? ""
}
eventsArray.append(newEvent)
}
}
}catch {
print(error)
}
推荐阅读
- java - 有没有办法使用 Java 11 的 HttpClient 从 HTTP 1.1 响应的状态行中获取原因短语?
- django - 当我尝试使用英语以外的任何语言进行搜索时出现服务器错误 (500)
- isabelle - 如何在 Isabelle 中证明“(⋀x. PROP ?P x) ⟹ PROP ?P ?x”?
- java - 如何在 Spring Boot War 中包含特定的 applicaction.properties
- python - 如何撤消 QAbstractTableModel 中的更改?
- postgresql - 如何在 jsonb 字段属性上使用 group_by 查询最新条目
- r - 如何从面板数据中按年份获取 Stargazer 汇总统计数据
- ruby - 为什么 Pathname.rmtree 在 Signal.trap('EXIT') 上失败
- javascript - 根据设定的数字范围对数组值进行分组/合并
- android - 我无法使用 phonegap 执行我的应用程序