2017-10-18 7 views
4

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!

+0

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

+0

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

+2

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

Antwort

0

Es war einfach .. ich die gleiche Art von Problem hatte ..

Schauen Sie Ihr Struct ist Decodierung und Encodierung Zeitstempel, geografische Breite und Länge wie Strings und JSON ist in Doppel- oder Floating-Typ.

struct MessageForPost:Codable { 
    let message: String 
    let timestamp: String 
    let latitude: String 
    let longitude: String 
} 

Und hier Json

{ 
    data: { 
     message: { 

      message: “Hey, a new message!”, 
      timestamp: 2017-09-10 10:22:33, 
      latitude: 62.233589156441724, 
      longitude: 25.735066461654696 
     } 
    } 
} 

.... Ich reparierte es an meinem Ende und ... es hat funktioniert ..

Edited denselben Datentyp verwenden ..