为什么在 Swift 中尝试序列化 JSON 时出现错误?

Why do I get an error when trying to serializing JSON in Swift?

我刚开始学习swift。所以如果涉及到swift,我是一个菜鸟。为了尝试和实践它,我正在尝试为 ios 制作一个杂货店应用程序。但现在我可能被困在最基本的事情之一上,序列化一个 JSON 对象而不使用库,所以只使用标准 swift 代码。所以我的问题是你能帮我解决序列化我从 api.

获得的数据的问题吗?

我正在使用 postman 来检查我从 api 得到了什么样的响应。当我访问 api 时,这是我得到的响应:

[
  {
    "id": 1,
    "name": "Regular List"
  },
  {
    "id": 2,
    "name": "List for diner"
  },
  {
    "id": 3,
    "name": "List 3"
  },
  {
    "id": 4,
    "name": "List for next week"
  },
  {
    "id": 6,
    "name": "Test name"
  }
]

在我的 swift 代码中,我试图通过这样做来获得此响应:

func getBoodschapListJSON(){
        let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
        let userId = prefs.integerForKey("UserId")
        let requestUrl = NSURL(string: "http://localhost:8080/api/lists/user/id/\(userId)")!
        let session = NSURLSession.sharedSession()

        let request = NSMutableURLRequest(URL: requestUrl)
        request.HTTPMethod = "GET"
        request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")

        session.dataTaskWithRequest(request, completionHandler: { (data, response, error) in

                do {
                    let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)

                    //Here comes some code to try and process the JSON object in the table View.
                } catch {
                    print("error serializing JSON: \(error)")
                }

        }).resume()
    }

但我从来没有得到有效的回应,我最终得到了错误: "error serializing JSON: Error Domain=NSCocoaErrorDomain Code=3840 "字符 0 周围的值无效。”UserInfo={NSDebugDescription=字符 0 周围的值无效。}”

我希望它与 JSON 格式不正确有关,以便 NSJSONSerialization 能够解释它。但我不确定,我看过几个与我有相同问题的堆栈溢出帖子。他们中的大多数人说使用 .AllowFragments 但这并没有解决我的错误。

是否有人愿意帮助我,以便我能够修复我的代码中的这个错误?

你的 URL 看起来有点奇怪,但它仍然可以像那样工作。尝试在浏览器中访问 URL(为 userId 设置一个 id)并确保它看起来没问题。如果是,请确保您的 API 代码中没有 html。例如,没有元标记(您可能正在使用)。

如果这不起作用,可能是代码问题。试试我的:

let urlAsString = "http://localhost:8080/api/lists/user/id/\(userId)"
do {
    let jsonDict: NSDictionary = try NSJSONSerialization.JSONObjectWithData(NSData(contentsOfURL: NSURL(string: urlString)!)!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
    print (jsonDict)
}
catch {
    print ("Couldn't get JSON... \(error)")
}

使用这个简单代码得到一个 jSon 数组

   let data = NSData(contentsOfURL: NSURL(string: "your URL")!)


        let jsonArray: NSArray = try! NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray

之后将此数组转换为 NSDictionary 并使用其值。转换为字典的示例是

 let cell  = tableView.dequeueReusableCellWithIdentifier("atCell")! as UITableViewCell

        let maindata = (data[indexPath.row] as! NSDictionary)
        cell.textLabel?.text = maindata["date"] as? String

p.s 我使用 table 视图来显示数据...