gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 12:59:29 26 4
gpt4 key购买 nike

我尝试将 JSON POST 到我的网络服务器,但它根本不起作用。它适用于 "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 上的 POST 的响应”

你能帮帮我吗?

最佳答案

你说:

I try to POST a JSON into my web server but it doesn't work at all

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

  1. 你有数据,否则你的守卫会回来的。
  2. 你没有出错,否则你的第二个守卫会回来的。

你正在将它归结为你的 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
}

当你这样做时,很容易通过将你的帖子传递给这样的函数来获得你的返回值:

func valuesFromData(jsonDict: [[String:AnyObject]]) {
let myValue = jsonDict["key"] as? String
let another = jsonDict["SomeOtherKey"] as? Int
}

如果您仍然遇到问题,您只需打印出我们的状态代码,看看您的 POST 无法正常工作的原因。在完成处理程序(闭​​包)中添加以下内容:

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
}

(简化)

关于json - 如何将数据序列化为 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34257203/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com