【问题标题】:Why do I get an error when trying to serializing JSON in Swift?为什么在 Swift 中尝试序列化 JSON 时会出错?
【发布时间】:2016-04-09 09:38:57
【问题描述】:

我刚开始学 swift。因此,如果谈到 Swift,我是个菜鸟。为了尝试和实践它,我正在尝试为 ios 制作一个杂货应用程序。但是现在我被困在可能是最基本的事情之一上,即在不使用库的情况下序列化 JSON 对象,因此只需使用标准的 swift 代码。所以我的问题是你能帮我解决我从 api 获得的数据序列化的问题吗?

我正在使用邮递员检查我从 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"
  }
]

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

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()
    }

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

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

有人能帮我解决我的代码中的这个错误吗?

【问题讨论】:

  • 请检查您从服务器获取的 json 格式是否正确。您可以在 jsonlint.com 或任何其他 json 验证器上进行检查。
  • @ArunGupta 我用 jsonlint.com 检查了它,它是有效的 json。我怀疑我调用的方法:“try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)”是否能够解释 api 返回的 json。我想我使用了正确的参数,但我是菜鸟,所以很容易出错。
  • 您可以发布“设置”文件夹和您的 API 代码吗?

标签: json swift serialization swift2 nsjsonserialization


【解决方案1】:

您的网址看起来有点奇怪,但它仍然可以这样工作。尝试在浏览器中访问 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)")
}

【讨论】:

  • 感谢您的建议。我真的认为它不可能是 URL,因为我已经检查了几次。现在我在浏览器中检查了它,我注意到我没有得到响应。猜猜我那里仍然有一个错误,当我遇到这种情况时,我讨厌它。我真的认为代码是错误的,但最终它是 url。但现在我想知道,什么代码更好,你的还是我的?因为两者现在都在工作,我想使用最佳实践。
  • @user3473161 我不知道,我认为差别不大。对于使用过我的版本的我来说,认为我的版本更容易。选择你想要的! :)
  • @user3473161 我发现了一个新的 JSON 代码。它更短,更简单。我很确定这个是最好的
  • 看起来不错,从现在开始我将使用那段代码。再次感谢。
【解决方案2】:

使用这个简单的代码来获取一个json数组

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


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

之后将此数组转换为 NSDictionary 并使用其值.. 转换为 Dictionary 的示例是

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

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

p.s 我用表格视图来显示数据...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 2022-01-24
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    相关资源
    最近更新 更多