Ich versuche, eine POST-Anforderung an meinem lokalen Server zu schreiben, das ist meine Funktion:Swift 4 Dekodierbare: Die angegebenen Daten nicht gültig 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()
}
Dies sind die Strukturen hier mit:
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
}
Und es war in der Lage
JSON String : {"data":{"message":{"message":"Hi","timestamp":"2017-10-18 00:50:13","latitude":"1.1","longitude":"2.2"}}}
zu drucken, aber es hält die Ansicht des ERROR:
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.})))
Warum ist es kein gültiger JSON ???
Hier ist mein Server API-POST-Request-Dokument:
POST
/api/message
{
data: {
message: {
message: “Hey, a new message!”,
timestamp: 2017-09-10 10:22:33,
latitude: 62.233589156441724,
longitude: 25.735066461654696
}
}
}
ich ganz etwas googeln getan haben, aber bin hier für eine sehr lange Zeit fest! Jede Hilfe wird geschätzt!
Ich lief Sie grundlegenden Dekodierungscode in Playground und es funktioniert gut. Ich könnte vorschlagen, dass Sie die 'Data' zu einem' String' dekodieren und es ausdrucken, nur um sicherzustellen, dass Sie genau wissen, was Sie zu dekodieren versuchen, denn wenn es mit 'POST' beginnt, dann ist das Ihr Problem – MadProgrammer
Drucken Sie die empfangenen Daten: 'print (Daten als NSData)' vor der 'decode'-Zeile. Das erste Byte muss "7B" sein. Die Fehlermeldung sagt, es ist nicht. – vadian
Was @vadian sagte. Sie haben die Frage so formuliert, als ob Sie glauben, dass mit der Art, wie Sie die Daten konstruieren, etwas nicht stimmt. Es ist nicht. Die Fehlermeldung, die Sie bekommen, ist eine von * entschlüsseln * einer JSON-Zeichenfolge zu Swift-Objekten. Wenn angegeben wird, dass der Text mit einem Array oder Objekt beginnen muss, bedeutet dies, dass die Zeichenfolge entweder mit "[" oder "{" beginnen muss. Wahrscheinlich ist die Antwort vom Server nicht JSON – JeremyP