13.12.2017:请转到“更新3”,因为我已经改变了我的功能!!!
从HTTP获取到我的Web API我收到了JSON响应,我需要在TableViewController
中逐行显示数据。但输出是空的,因为我认为我无法正确地从data_list中获取stdata
。我认为我在做类型的错误吗?
这是代码的相关部分:
func extract_json(_ data: Data){
// added for UPDATE 2
let string = String.init(data: data, encoding: .utf8)
print(string)
do {
let json = try JSONSerialization.jsonObject(with: data, options: [.allowFragments])
let data_list = json as? [AnyObject]
for stdata in data_list! {
if let StMsgID = stdata["MsgID"] as? String { // for UPDATE 1: set breakpoint to this line
if let StSerial = stdata["Serial"] as? String{
TableData.append(StMsgID + " : " + StSerial)
}
}
}
} catch let error as NSError {
print(error)
return
}
DispatchQueue.main.async(execute: {self.do_table_refresh()})
}
func do_table_refresh()
{
self.tableView.reloadData()
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return TableData.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = TableData[indexPath.row]
return cell
}
当我在调试器中显示它时,这是JSON
:
▿ 1 element
- 0 : [{"CreatedAt":"01-11-17 10:46","MsgID":"ST88”,”Serial”:”88”},{“CreatedAt":"03-12-17 21:35","MsgID”:”ST99”,”Serial”:”99”}]
这是 data_list :
▿ Optional<Array<AnyObject>>
▿ some : 1 element
- 0 : [{"CreatedAt":"01-11-17 10:46","MsgID":"ST88”,”Serial”:”88”},{“CreatedAt":"03-12-17 21:35","MsgID”:”ST99”,”Serial”:”99”}]
我希望在TableViewController中看到两行:
ST88 : 88
ST99 : 99
我得到的是一张空桌子。
提前谢谢!!!
更新1:
当我将断点设置为line:
时if let StMsgID = stdata["MsgID"] as? String...
当我深入研究“stdata”时,我可以看到以下值 - &gt; 0x ... - &gt; NSMutableString - &gt; NSString - &gt; NSObject - &gt;赛:
[{"CreatedAt":"01-11-17 10:46","MsgID":"ST88”,”Serial”:”88”},{“CreatedAt":"03-12-17 21:35","MsgID”:”ST99”,”Serial”:”99”}]
它是否正确解析,因为我仍然看到两个数据集?在这一点上,我希望只能看到ST88的第一个数据集。
更新2:
在我的函数顶部添加了以下代码:
let string = String.init(data: data, encoding: .utf8)
print(string)
输出结果为:
Optional("[\"[{\\\"CreatedAt\\\":\\\"01-11-17 10:46\\\",\\\"MsgID\\\":\\\"ST88\\\”,\\\”Serial\\\”:\\\”88\\\”},{\\\"CreatedAt\\\":\\\"03-12-17 21:35\\\",\\\"MsgID\\\”:\\\”ST99\\\”,\\\”Serial\\\”:\\\”99\\\”}]\"]")
==================================
更新3:
我已将我的代码更改为使用SwiftyJson,但仍无法使其正常工作。
这是我正在使用的最新格式,低于我的Web API的响应:
["{\"inbox\":[{\"CreatedAt\":\"01-11-17 10:46\",\"MsgID\":\"ST88\",\"Serial\":\"88\"},{\"CreatedAt\":\"03-12-17 21:35\",\"MsgID\":\"ST99\",\"Serial\":\"99\"}]}"]
根据jsonlint.com,这是有效的。
这是我在Swift 3中使用SwiftyJson的新功能:
// using SwiftyJSON !!!
func extract_json(_ data: Data)
{
do
{
let json = try JSON(data: data)
for obj in json["inbox"]
{
let value = obj["MsgID"].string // error here (not compiling)
print (value)
TableData.append(value)
}
}
catch let error as NSError
{
print(error)
return
}
DispatchQueue.main.async(execute: {self.do_table_refresh()})
}
我希望看到:
ST88
ST99
它甚至没有编译,我得到的行
的错误let value = obj["MsgID"].string
是:
Value of tuple type '(String, JSON)' has no member 'subscript'
答案 0 :(得分:0)
将let data_list = json as? [AnyObject]
更改为let data_list = json as? [[String: Any]]
。
更新:
你从网络服务器返回的json在技术上是有效的json,但它不是你想要的。返回的当前json是一个字符串列表,你想要的是一个对象列表。
您需要更新您的网络服务器,以删除第一个"
和最后一个"
。
["{\"inb...
需要[{\"inb
...99\"}]}"]
需要99\"}]}]
我猜测所有\
只是额外的信息,因为你已经在调试器中打印了它。但是,如果您从网络服务器获取这些\
,那么您也需要将其删除。
答案 1 :(得分:0)
在json
中,路由元素是一个包含字典数组(数组数组)的数组。因此,如果您需要按照描述提取值,您应该获取根数组的第一个对象,然后迭代它。可能类似于:
let data_list = json as? [[[String: Any]]]
而不是
let data_list = json as? [AnyObject]
在for循环中的当前实现中,stdata
是一个数组。