无法解析JSON(SwiftyJson)从Get到我的Web API

时间:2017-12-11 01:48:10

标签: json swift swifty-json

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'

2 个答案:

答案 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是一个数组。