无法从 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 是一个数组。