Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将数据序列化为JSON对象_Json_Swift_Serialization_Swift2 - Fatal编程技术网

如何将数据序列化为JSON对象

如何将数据序列化为JSON对象,json,swift,serialization,swift2,Json,Swift,Serialization,Swift2,我尝试将JSON发布到我的web服务器中,但根本不起作用。它适用于“DELETE”和“GET”,但对于“POST”,它根本不起作用,并且会得到错误 这是我的密码: let postsEndpoint:String = "http://ideabase.herokuapp.com/categories" guard let postsURL = NSURL(string: postsEndpoint) else { print("Error: cannot create

我尝试将JSON发布到我的web服务器中,但根本不起作用。它适用于“DELETE”和“GET”,但对于“POST”,它根本不起作用,并且会得到错误

这是我的密码:

 let postsEndpoint:String = "http://ideabase.herokuapp.com/categories"
    guard let postsURL = NSURL(string: postsEndpoint) else {
        print("Error: cannot create URL")
        return
    }
    let postsUrlRequest = NSMutableURLRequest(URL: postsURL)
    postsUrlRequest.HTTPMethod = "POST"

    let newPost: NSDictionary = ["id":7, "title": "Purple","created_at": "2015-12-08 08:06:55","updated_at":"2015-12-08 08:06:55"]
    do {
        let jsonPost = try NSJSONSerialization.dataWithJSONObject(newPost, options: [])
        postsUrlRequest.HTTPBody = jsonPost

        let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session = NSURLSession(configuration: config)

        let createTask = session.dataTaskWithRequest(postsUrlRequest, completionHandler: {
            (data, response, error) in
            guard let responseData = data else {
                print("Error: did not receive data")
                return
            }
            guard error == nil else {
                print("error calling GET on /categories/1")
                print(error)
                return
            }
            // parse the result as JSON, since that's what the API provides
            let post: NSDictionary
            do {
                post = try NSJSONSerialization.JSONObjectWithData(responseData,
                    options: []) as! NSDictionary
            } catch  {
                print("error parsing response from POST on /categories")
                return
            }
            // now we have the post, let's just print it to prove we can access it
            print("The post is: " + post.description)

            // the post object is a dictionary
            // so we just access the title using the "title" key
            // so check for a title and print it if we have one
            if let postID = post["id"] as? Int
            {
                print("The ID is: \(postID)")
            }
        })
        createTask.resume()
我收到错误“解析来自/categories上的帖子的响应”

你能帮帮我吗?

你说:

我尝试将JSON发布到我的web服务器中,但根本不起作用

查看您的代码时,有两件事我们可以肯定。

  • 你有数据,否则你的警卫会回来的
  • 你没有错误,否则你的第二个守卫就会回来
  • 你要把它归结为你的NSJSONSerialization,所以在那之前你都很优秀。现在你只需要调整你的序列化类型,你应该(也许)做得很好

    您需要将您的
    post
    类型更改为
    [[String:AnyObject]]
    ,因为我们将在您的try catch中为您播放

     let post: [[String:AnyObject]]
     do {
         post = try NSJSONSerialization.JSONObjectWithData(responseData,
                        options: .MutableLeaves) as! [[String:AnyObject]]
     } catch  {
         print("error parsing response from POST on /categories")
         return
     }
    
    当您这样做时,通过将post传递到如下函数中,很容易获得返回值:

    func valuesFromData(jsonDict: [[String:AnyObject]]) {
        let myValue = jsonDict["key"] as? String
        let another = jsonDict["SomeOtherKey"] as? Int
    }
    
    如果你仍然有问题,你只需要打印出我们的状态码,看看为什么你的帖子不起作用。在完成处理程序(闭包)中添加以下内容:

    guard let status = response.statusCode as? NSHTTPURLResponse else {
        return
    }
    print("status code: \(status)")
    

    下面是一个完美工作的NSURLRequest示例

    func postNewMessage(messageType: String, messageBody: String) {
    
            guard let token = AppDelegate.userDefaults.valueForKey("token") else {
                return
            }
    
            let params = [
                "messageType": messageType,
                "messageBody": messageBody
            ]
    
            var jsonData: NSData?
            var jsonString: NSString?
            var tokenResponse: String?
    
            do {
                jsonData = try NSJSONSerialization.dataWithJSONObject(params, options: [])
            } catch {
                print(error)
                return
            }
    
            let request = NSMutableURLRequest(URL: NSURL(string: "http://localhost:8080/messages")!)
            let session = NSURLSession.sharedSession()
    
            request.HTTPMethod = "POST"
            request.addValue(token as! String, forHTTPHeaderField: "user-auth-token")
            request.HTTPBody = jsonData!
            request.addValue("application/json", forHTTPHeaderField: "Content-Type")
            request.addValue("application/json", forHTTPHeaderField: "Accept")
    
            let task = session.dataTaskWithRequest(request) { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
    
                guard let testResponse = response as? NSHTTPURLResponse else {
                    print("failed \(response)")
                    return
                }
    
                guard let status = HTTPStatusCodes(rawValue: testResponse.statusCode) else {
                    print("failed again")
                    return
                }
    
                switch status {
                case .Created:
                    let headerFields = testResponse.allHeaderFields
                    tokenResponse = headerFields["user-auth-token"] as? String
                    guard let returnedData = data else {
                        print("no data was returned")
                        break
                    }
                    // convert data to string
                    jsonString = NSString(data: returnedData, encoding: NSUTF8StringEncoding) ?? "Invalid JSON"
                    print("\(tokenResponse)\n\n\(jsonString!)")
    
                    // update user interface
                    dispatch_sync(dispatch_get_main_queue()) {
                        print("derp")
                    }
    
                default:
                    print("asdf")
                }
            }
            task.resume()
        }
    
    您还需要使用此枚举才能使其正常工作

    enum HTTPStatusCodes : Int {
        case Ok = 200
        case Created = 201
        case BadRequest = 404
    }
    

    (简化)

    我已经尝试过了,但仍然没有效果,而且响应中没有状态码成员!这给我一个机会error@Gharary我添加了一个完全可操作的NSURLSession,让您可以使用Charles或其他代理将代码与try进行比较,这样您就可以查看系统中进出的所有http流量。然后,您可以确保帖子符合预期,并查看回复的详细信息。@Gharay,我添加了一个工作帖子请求的示例