斯威夫特4可解:给定的数据是不是有效的JSON
问题描述:
我想写一个POST请求到我的本地服务器,这是我的函数:斯威夫特4可解:给定的数据是不是有效的JSON
@IBAction func postButtonAction(_ sender: UIButton) {
guard let url = URL(string:"http://localhost:443/api/message") else {return}
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
print("POSTED")
let date : Date = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let dateTime = dateFormatter.string(from: date)
let newPost = MessageForPost(message: "Hi", timestamp: dateTime, latitude: "1.1", longitude: "2.2")
let newData = DataForPost(message: newPost)
let newPackage = PackageForPost(data: newData)
do {
let jsonBody = try JSONEncoder().encode(newPackage)
request.httpBody = jsonBody
print("jsonBody:",jsonBody)
let jsonBodyString = String(data: jsonBody, encoding: .utf8)
print("JSON String : ", jsonBodyString!)
} catch let err {
print("jsonBody Error: ",err)
}
let session = URLSession.shared
let task = session.dataTask(with: request){ (data,response,err) in
guard let data = data else {return}
do{
let sendPost = try JSONDecoder().decode(PackageForPost.self, from: data)
print("DATA:\(data)")
}catch let err{
print("Session Error: ",err)
}
}
task.resume()
}
这些都是用这里的结构:
struct PackageForPost:Encodable, Decodable{
let data: DataForPost
}
struct DataForPost:Encodable, Decodable{
let message: MessageForPost
}
struct MessageForPost:Codable {
let message: String
let timestamp: String
let latitude: String
let longitude: String
}
它能够打印
JSON String : {"data":{"message":{"message":"Hi","timestamp":"2017-10-18 00:50:13","latitude":"1.1","longitude":"2.2"}}}
但一直显示此错误:
Session Error: dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.})))
为什么它不是一个有效的JSON?
这里是我的服务器的API POST请求文档:
POST
/api/message
{
data: {
message: {
message: “Hey, a new message!”,
timestamp: 2017-09-10 10:22:33,
latitude: 62.233589156441724,
longitude: 25.735066461654696
}
}
}
我已经做了相当长的一段谷歌搜索,但我在这里卡住了很长的时间! 任何帮助表示赞赏!
答
很简单..我有同样问题的种类..
看你的结构是解码和编码时间戳,纬度和经度的字符串和JSON是双人或浮动型。
struct MessageForPost:Codable {
let message: String
let timestamp: String
let latitude: String
let longitude: String
}
而且这里的Json
{
data: {
message: {
message: “Hey, a new message!”,
timestamp: 2017-09-10 10:22:33,
latitude: 62.233589156441724,
longitude: 25.735066461654696
}
}
}
....我固定它在我的结束,......它的工作..
编辑 使用相同的数据类型..
我在Playground中运行了基本的解码代码,它工作正常。我可能会建议你将'Data'解码为'String'并打印出来,以确保你确切知道你想要解码什么,因为如果它以'POST'开头,那么这就是你的问题 – MadProgrammer
打印接收到的数据: '在'decode'行之前打印(数据为NSData)。第一个字节必须是“7B”。错误消息说,它不是。 – vadian
@vadian说什么。你已经构思了这个问题,好像你认为你构建数据的方式有问题。没有。你得到的错误信息实际上是一个来自*解码*一个JSON字符串到Swift对象。当它表示文本必须以数组或对象开头时,这意味着该字符串必须分别以'['或'{'开头。可能从服务器的响应不是JSON – JeremyP