尝试将json解析为类对象失败
我需要帮助使用Swift解析json。我无法使用swift将它们解析为类对象的数组。我尝试的是将json键值绑定到一个对象数组中并返回。但是,我无法处理这些类型。这太令人困惑了 谁能帮帮我吗 我所拥有的json:尝试将json解析为类对象失败,json,swift,Json,Swift,我需要帮助使用Swift解析json。我无法使用swift将它们解析为类对象的数组。我尝试的是将json键值绑定到一个对象数组中并返回。但是,我无法处理这些类型。这太令人困惑了 谁能帮帮我吗 我所拥有的json: { "mass_info1": [{ "mass_id":7780, "mass_date":"5/1/2019", "mass_time":"7:30 PM", "mass_location":"", "mass_descrip
{
"mass_info1":
[{
"mass_id":7780,
"mass_date":"5/1/2019",
"mass_time":"7:30 PM",
"mass_location":"",
"mass_description": “Blah1”
} ] ,
"mass_info2":
[ {
"mass_id":7781,
"mass_date":"6/10/2019",
"mass_time":"7:30 PM",
"mass_location”:”1234 some place Los Angeles”,
"mass_description": “blah2”
} ] ,
"mass_info3":
[ {
"mass_id":7783,
"mass_date":"5/21/2019",
"mass_time":"7:30 PM",
"mass_location":"",
"mass_description": “blah3”
} ] ,
"mass_info4":
[ {
"mass_id":1115,
"mass_date":"4/5/2019",
"mass_time":"2:30 PM",
"mass_location":"4050 Mission Ave, Oceanside, CA 92057",
"mass_description": “blah4”
} ]
}
类MassInfoObject导入基础
以及我从URLSession获取json的代码
func getjson()->[MassInfoObject]? {
let urlPath = "http://myclassinfo.com/dev/json.php"
let url = URL(string: urlPath)
var massObjArray = [MassInfoObject]()
var index:Int = 0
let task = URLSession.shared.dataTask(with: url!) { data, response, error in
print("Task completed")
guard data != nil && error == nil else {
//print(error?.localizedDescription)
return
}
do {
if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary {
for (key, value) in jsonResult {
//print("Value: \(value) for key: \(key)")
if let results = jsonResult[key] as? [String]
{
let dict = results[index].toJSON() as? [String:AnyObject] // can be any type here
for (key,value) in dict!{
let result2 = dict![key] as! String
print (result2)
}
}
}
}
} catch let parseError as NSError {
print("JSON Error \(parseError.localizedDescription)")
}
}
task.resume()
return massObjArray
}
您试图解析的json没有非常合理的结构。如果您可以控制json,那么应该首先处理它。如果您没有控制权,我建议在解析之前在客户端转换json 在操场上进行以下工作:
let str = """
{ "mass_info1": [{ "mass_id":7780, "mass_date":"5/1/2019", "mass_time":"7:30 PM", "mass_location":"", "mass_description": "Blah1"
} ] ,
"mass_info2": [ { "mass_id":7781, "mass_date":"6/10/2019", "mass_time":"7:30 PM", "mass_location":"1234 some place Los Angeles", "mass_description": "Blah2"
} ] ,
"mass_info3":
[ { "mass_id":7783, "mass_date":"5/21/2019", "mass_time":"7:30 PM", "mass_location":"", "mass_description": "blah3"
} ] ,
"mass_info4":
[ { "mass_id":1115, "mass_date":"4/5/2019", "mass_time":"2:30 PM", "mass_location":"4050 Mission Ave, Oceanside, CA 92057", "mass_description": "blah4"
} ]
}
"""
struct MassInfoObject: Codable {
var mass_id: Int
var mass_date: String?
var mass_time: String?
var mass_location: String?
var mass_description: String?
}
let data = str.data(using: .utf8)!
let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: [[String: Any]]]
let jsonArray = json!.values.map { $0 }
let cleanedJson = try JSONSerialization.data(withJSONObject: jsonArray, options: [])
let decoder = JSONDecoder()
let items = try decoder.decode([[MassInfoObject]].self, from: cleanedJson)
第一步是将json转换为易于解析的内容。因为现在MassInfoObject符合Codable
,所以可以使用一个简单的JSONDecoder来解码对象数组,这只是一行代码
另外,在您的网络代码中,您正在调用一个异步任务,但是您的任务将立即返回,这是行不通的。从getJson
函数返回时,还没有结果。最简单的方法是使用一个可以调用结果的闭包:
在您的网络代码中,它看起来是这样的:
func getjson(handler: @escaping ([MassInfoObject]?)->()) {
let urlPath = "http://myclassinfo.com/dev/json.php"
let url = URL(string: urlPath)
let task = URLSession.shared.dataTask(with: url!) { data, response, error in
print("Task completed")
guard let data = data && error == nil else {
//print(error?.localizedDescription)
return
}
do {
let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: [[String: Any]]]
let jsonArray = json!.values.map { $0 }
let cleanedJson = try JSONSerialization.data(withJSONObject: jsonArray, options: [])
let decoder = JSONDecoder()
let items = try decoder.decode([[MassInfoObject]].self, from: cleanedJson).compactMap { $0 }
handler(items)
} catch let parseError as NSError {
print("JSON Error \(parseError.localizedDescription)")
handler(nil)
}
}
task.resume()
}
如果您的json如下所示:
[
{
"mass_description": "Blah1",
"mass_date": "5/1/2019",
"mass_location": "",
"mass_time": "7:30 PM",
"mass_id": 7780
},
{
"mass_description": "blah2",
"mass_date": "6/10/2019",
"mass_location": "1234 some place Los Angeles",
"mass_time": "7:30 PM",
"mass_id": 7781
},
{
"mass_description": "blah3",
"mass_date": "5/21/2019",
"mass_location": "",
"mass_time": "7:30 PM",
"mass_id": 7783
},
{
"mass_description": "blah4",
"mass_date": "4/5/2019",
"mass_location": "4050 Mission Ave, Oceanside, CA 92057",
"mass_time": "2:30 PM",
"mass_id": 1115
}
]
您可以很容易地解码:
let items = try JSONDecoder().decode([MassInfoObject].self, data)
您试图解析的json没有非常合理的结构。如果您可以控制json,那么应该首先处理它。如果您没有控制权,我建议在解析之前在客户端转换json 在操场上进行以下工作:
let str = """
{ "mass_info1": [{ "mass_id":7780, "mass_date":"5/1/2019", "mass_time":"7:30 PM", "mass_location":"", "mass_description": "Blah1"
} ] ,
"mass_info2": [ { "mass_id":7781, "mass_date":"6/10/2019", "mass_time":"7:30 PM", "mass_location":"1234 some place Los Angeles", "mass_description": "Blah2"
} ] ,
"mass_info3":
[ { "mass_id":7783, "mass_date":"5/21/2019", "mass_time":"7:30 PM", "mass_location":"", "mass_description": "blah3"
} ] ,
"mass_info4":
[ { "mass_id":1115, "mass_date":"4/5/2019", "mass_time":"2:30 PM", "mass_location":"4050 Mission Ave, Oceanside, CA 92057", "mass_description": "blah4"
} ]
}
"""
struct MassInfoObject: Codable {
var mass_id: Int
var mass_date: String?
var mass_time: String?
var mass_location: String?
var mass_description: String?
}
let data = str.data(using: .utf8)!
let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: [[String: Any]]]
let jsonArray = json!.values.map { $0 }
let cleanedJson = try JSONSerialization.data(withJSONObject: jsonArray, options: [])
let decoder = JSONDecoder()
let items = try decoder.decode([[MassInfoObject]].self, from: cleanedJson)
第一步是将json转换为易于解析的内容。因为现在MassInfoObject符合Codable
,所以可以使用一个简单的JSONDecoder来解码对象数组,这只是一行代码
另外,在您的网络代码中,您正在调用一个异步任务,但是您的任务将立即返回,这是行不通的。从getJson
函数返回时,还没有结果。最简单的方法是使用一个可以调用结果的闭包:
在您的网络代码中,它看起来是这样的:
func getjson(handler: @escaping ([MassInfoObject]?)->()) {
let urlPath = "http://myclassinfo.com/dev/json.php"
let url = URL(string: urlPath)
let task = URLSession.shared.dataTask(with: url!) { data, response, error in
print("Task completed")
guard let data = data && error == nil else {
//print(error?.localizedDescription)
return
}
do {
let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: [[String: Any]]]
let jsonArray = json!.values.map { $0 }
let cleanedJson = try JSONSerialization.data(withJSONObject: jsonArray, options: [])
let decoder = JSONDecoder()
let items = try decoder.decode([[MassInfoObject]].self, from: cleanedJson).compactMap { $0 }
handler(items)
} catch let parseError as NSError {
print("JSON Error \(parseError.localizedDescription)")
handler(nil)
}
}
task.resume()
}
如果您的json如下所示:
[
{
"mass_description": "Blah1",
"mass_date": "5/1/2019",
"mass_location": "",
"mass_time": "7:30 PM",
"mass_id": 7780
},
{
"mass_description": "blah2",
"mass_date": "6/10/2019",
"mass_location": "1234 some place Los Angeles",
"mass_time": "7:30 PM",
"mass_id": 7781
},
{
"mass_description": "blah3",
"mass_date": "5/21/2019",
"mass_location": "",
"mass_time": "7:30 PM",
"mass_id": 7783
},
{
"mass_description": "blah4",
"mass_date": "4/5/2019",
"mass_location": "4050 Mission Ave, Oceanside, CA 92057",
"mass_time": "2:30 PM",
"mass_id": 1115
}
]
您可以很容易地解码:
let items = try JSONDecoder().decode([MassInfoObject].self, data)
谢谢马塞尔和所有帮助我的人。这是我使用的代码
struct MassObj:Decodable{
var mass_id:Int
var mass_date: String
var mass_time:String
var mass_location:String
var mass_description:String
}
func getJsonArray2() {
let urlPath = "http://myclassinfo.com/dev/json.php"
guard let url = URL(string: urlPath) else {return }
let task = URLSession.shared.dataTask(with: url)
{
data, response, error in
print("Task completed")
guard data != nil && error == nil else {
//print(error?.localizedDescription)
return
}
do{
var massArray = [MassObj]()
massArray = try JSONDecoder().decode([MassObj].self, from:data!)
for object in massArray {
print("\(object.mass_id) == \(object.mass_date) == \(object.mass_description)")
}
}catch let jerr {
print(jerr)
}
}
task.resume()
}
================
json是
[
{
"mass_description": "Blah1",
"mass_date": "5/1/2019",
"mass_location": "",
"mass_time": "7:30 PM",
"mass_id": 7780
},
{
"mass_description": "blah2",
"mass_date": "6/10/2019",
"mass_location": "1234 some place Los Angeles",
"mass_time": "7:30 PM",
"mass_id": 7781
},
{
"mass_description": "blah3",
"mass_date": "5/21/2019",
"mass_location": "",
"mass_time": "7:30 PM",
"mass_id": 7783
},
{
"mass_description": "blah4",
"mass_date": "4/5/2019",
"mass_location": "4050 Mission Ave, Oceanside, CA 92057",
"mass_time": "2:30 PM",
"mass_id": 1115
}
]
谢谢马塞尔和所有帮助我的人。这是我使用的代码
struct MassObj:Decodable{
var mass_id:Int
var mass_date: String
var mass_time:String
var mass_location:String
var mass_description:String
}
func getJsonArray2() {
let urlPath = "http://myclassinfo.com/dev/json.php"
guard let url = URL(string: urlPath) else {return }
let task = URLSession.shared.dataTask(with: url)
{
data, response, error in
print("Task completed")
guard data != nil && error == nil else {
//print(error?.localizedDescription)
return
}
do{
var massArray = [MassObj]()
massArray = try JSONDecoder().decode([MassObj].self, from:data!)
for object in massArray {
print("\(object.mass_id) == \(object.mass_date) == \(object.mass_description)")
}
}catch let jerr {
print(jerr)
}
}
task.resume()
}
================
json是
[
{
"mass_description": "Blah1",
"mass_date": "5/1/2019",
"mass_location": "",
"mass_time": "7:30 PM",
"mass_id": 7780
},
{
"mass_description": "blah2",
"mass_date": "6/10/2019",
"mass_location": "1234 some place Los Angeles",
"mass_time": "7:30 PM",
"mass_id": 7781
},
{
"mass_description": "blah3",
"mass_date": "5/21/2019",
"mass_location": "",
"mass_time": "7:30 PM",
"mass_id": 7783
},
{
"mass_description": "blah4",
"mass_date": "4/5/2019",
"mass_location": "4050 Mission Ave, Oceanside, CA 92057",
"mass_time": "2:30 PM",
"mass_id": 1115
}
]
您的JSON组织得非常糟糕。为什么要有一个顶级字典,其中每个键的值都是一个数组,其中有一个字典?您应该在顶部有一个数组,其中只包含字典列表。您的JSON组织得非常糟糕。为什么要有一个顶级字典,其中每个键的值都是一个数组,其中有一个字典?您应该在顶部有一个数组,其中只包含字典列表。感谢Marcel,我在行处理程序(项)上有编译错误。错误消息是无法将“[[MassInfoObject]]”类型的值转换为预期的参数类型“[MassInfoObject]”。我应该有处理程序。追加(项)我更新了代码,仍然需要平坦响应。目前它还不是很优雅(就像在,一点也不)。如果你能控制json格式,那就更好了。谢谢Marcel,如果你想更改json,你会更改什么?@JohnMiky,因为你肯定知道json是大量的,我建议删除冗余信息,例如
“description:”Blah1”,“date:”2019年5月1日”,“location:”,“time:“7:30 PM”,“id”:7780},
。然后可以声明符合命名约定的结构成员,去掉下划线字符。感谢Marcel,Vadian我更改了json并使用了let items=try JSONDecoder().decode([MassInfoObject].self,data)
它工作得非常好。感谢您的帮助谢谢Marcel,我在行处理程序(项)上有编译错误错误错误消息是无法将“[[MassInfoObject]]”类型的值转换为预期的参数类型“[MassInfoObject]”?我是否应该有处理程序。追加(项)我更新了代码,仍然需要平坦响应。目前它还不是很优雅(就像在,一点也不)。如果你能控制json格式,那就更好了。谢谢Marcel,如果你想更改json,你会更改什么?@JohnMiky,因为你肯定知道json是大量的,我建议删除冗余信息,例如“description:”Blah1”,“date:”2019年5月1日”,“location:”,“time:“7:30 PM”,“id”:7780},
。然后可以声明符合命名约定的结构成员,去掉下划线字符。感谢Marcel,Vadian我更改了json并使用了let items=try JSONDecoder().decode([MassInfoObject].self,data)
它工作得非常好。谢谢你的帮助