2017-10-18 63 views
4

我想寫一個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 
     } 
    } 
} 

我已經做了相當長的一段谷歌搜索,但我在這裏卡住了很長的時間! 任何幫助表示讚賞!

+0

我在Playground中運行了基本的解碼代碼,它工作正常。我可能會建議你將'Data'解碼爲'String'並打印出來,以確保你確切知道你想要解碼什麼,因爲如果它以'POST'開頭,那麼這就是你的問題 – MadProgrammer

+0

打印接收到的數據: '在'decode'行之前打印(數據爲NSData)。第一個字節必須是「7B」。錯誤消息說,它不是。 – vadian

+2

@vadian說什麼。你已經構思了這個問題,好像你認爲你構建數據的方式有問題。沒有。你得到的錯誤信息實際上是一個來自*解碼*一個JSON字符串到Swift對象。當它表示文本必須以數組或對象開頭時,這意味着該字符串必須分別以'['或'{'開頭。可能從服務器的響應不是JSON – JeremyP

回答

0

很簡單..我有同樣問題的種類..

看你的結構是解碼和編碼時間戳,緯度和經度的字符串和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 
     } 
    } 
} 

....我固定它在我的結束,......它的工作..

編輯 使用相同的數據類型..