无法从 Get to my Web API 解析 JSON (SwiftyJson)
Cannot parse JSON (SwiftyJson) from Get to my Web API
13.12.2017:请跳转到 "Update 3",因为我已经更改了我的功能!!!
从 HTTP Get 到我的网站 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
我得到的是一个空 table。
提前致谢!!!
更新 1:
当我设置断点到行时:
if let StMsgID = stdata["MsgID"] as? String...
当我深入 "stdata" -> 0x... -> NSMutableString -> NSString -> NSObject -> isa:[=28 时,我可以看到以下值=]
[{"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,但仍然无法正常工作。
这是我现在使用的最新格式,低于我网站的响应 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'
将 let data_list = json as? [AnyObject]
更改为 let data_list = json as? [[String: Any]]
。
更新:
从您的网络服务器返回的 json 在技术上是有效的 json,但这不是您想要的。当前json返回的是字符串列表,你要的是对象列表。
您需要更新网络服务器以删除第一个 "
和最后一个 "
。
["{\"inb...
需要 [{\"inb
...99\"}]}"]
需要 99\"}]}]
我猜所有 \
都只是额外的信息,因为您已经在调试器中打印了它。但是,如果您从网络服务器获取这些 \
,那么您也需要删除它们。
在您的 json
中,路由元素是一个包含字典数组(数组的数组)的数组。所以,如果您需要按照描述提取值,您应该获取根数组的第一个对象,然后遍历 it.Means,例如:
let data_list = json as? [[[String: Any]]]
而不是
let data_list = json as? [AnyObject]
在 for 循环内的当前实现中,stdata
是一个数组。
13.12.2017:请跳转到 "Update 3",因为我已经更改了我的功能!!!
从 HTTP Get 到我的网站 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
我得到的是一个空 table。
提前致谢!!!
更新 1:
当我设置断点到行时:
if let StMsgID = stdata["MsgID"] as? String...
当我深入 "stdata" -> 0x... -> NSMutableString -> NSString -> NSObject -> isa:[=28 时,我可以看到以下值=]
[{"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,但仍然无法正常工作。
这是我现在使用的最新格式,低于我网站的响应 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'
将 let data_list = json as? [AnyObject]
更改为 let data_list = json as? [[String: Any]]
。
更新:
从您的网络服务器返回的 json 在技术上是有效的 json,但这不是您想要的。当前json返回的是字符串列表,你要的是对象列表。
您需要更新网络服务器以删除第一个 "
和最后一个 "
。
["{\"inb...
需要[{\"inb
...99\"}]}"]
需要99\"}]}]
我猜所有 \
都只是额外的信息,因为您已经在调试器中打印了它。但是,如果您从网络服务器获取这些 \
,那么您也需要删除它们。
在您的 json
中,路由元素是一个包含字典数组(数组的数组)的数组。所以,如果您需要按照描述提取值,您应该获取根数组的第一个对象,然后遍历 it.Means,例如:
let data_list = json as? [[[String: Any]]]
而不是
let data_list = json as? [AnyObject]
在 for 循环内的当前实现中,stdata
是一个数组。