2017-08-17 48 views
1

我有一個非常簡單的模型structStudent其中只有兩個屬性firstNamelastName:正如你看到的上面JSON數據包含在我的簡單的情況下,特殊字符

struct Student { 
    let firstName: String 
    let lastName: String 

    init(_ firstName: String, _ lastName: String) { 
     self.firstName = firstName 
     self.lastName = lastName 
    } 

    // Convert to json data 
    func toData() -> Data? { 
     var json = [String: Any]() 
     let mirror = Mirror(reflecting: self) 
     for child in mirror.children { 
      if let key = child.label?.trimmingCharacters(in: .whitespacesAndNewlines) { 
       json[key] = child.value 
      } 
     } 
     do { 
      return try JSONSerialization.data(withJSONObject: json, options: []) 
     } catch { 
      print("\(error.localizedDescription)") 
     } 

     return nil 
    } 
} 

,我創建了一個toData()功能,我使用將模型對象轉換爲我的HTTP請求主體的JSON數據。

創建Student實例是:

let student = Student("John", "Smith") 

我JSON數據是:

let jsonData = student.toData() 

後來我被設置爲我的URLRequest體:

request.httpBody = jsonData! 

然而,後端團隊總是看到:

{\"firstName\":\"John\", \"lastName\":\"Smith\"} 

但是後端期待:

{"firstName":"John", "lastName":"Smith"} 

我肯定它不是後端問題。看起來像我的toData()功能需要改進。但我不知道該怎麼做。有人能幫助我嗎?

+0

可能的複製[如何防止NSJSONSerialization在URL中添加額外的轉義](https://stackoverflow.com/questions/19651009/how-to-prevent-nsjsonserialization-from-adding-extra-escapes-in-url) – the4kman

+0

爲什麼你不生成t他手動JSON字典,手動生成JSON,然後反序列化和打印它似乎給出了正確的結果。如果你的真實類在很多領域都變得更復雜,你可以使用像ObjectMapper這樣的第三方庫來解決這個問題,或者等待Swift4的Codable協議。 –

+0

後端團隊看到的** JSON **'{\「firstName \」:\「John \」,\「lastName \」:\「Smith \」}'是有效的'JSON'格式。那有什麼問題? – nayem

回答

0

試試這個:

if let jsonString:String = String(data: jsonData!, encoding: String.Encoding.utf8) { 
    request.httpBody = jsonString.data(using: String.Encoding.utf8) 
} 
+0

無法正常工作 –

0

你可以通過你的結構手動轉換成字典擺脫多餘的反斜槓。

我使用虛擬休息服務器(rest-server-dummy from npm)測試了下面的方法,並且在」字符周圍沒有額外的反斜槓。

struct Student { 
    let firstName: String 
    let lastName: String 

    init(_ firstName: String, _ lastName: String) { 
     self.firstName = firstName 
     self.lastName = lastName 
    } 

    // Convert to json data 
    func toData() -> Data? { 
     var json = [String: Any]() 
     json["firstName"] = firstName 
     json["lastname"] = lastName 

     do { 
      return try JSONSerialization.data(withJSONObject: json, options: []) 
     } catch { 
      print("\(error.localizedDescription)") 
     } 

     return nil 
    } 
} 

我用這種方法來將數據發送到所述虛擬服務器上本地主機上運行:

var request = URLRequest(url:URL(string: "http://localhost:8080/username")!) 
request.httpMethod = "POST" 
request.httpBody = student.toData() 
URLSession.shared.dataTask(with: request, completionHandler: { data, response, error in 
    data 
    response 
    error 
}).resume() 

從服務器日誌輸出的內容:的

{ 
    "lastname": "Smith", 
    "firstName": "John" 
} 
+0

謝謝,我會盡快嘗試,並會盡快回復您。 –

+0

嗯......有趣的是,我仍然遇到同樣的問題。 –

+0

然後問題似乎在後端,這段代碼產生了預期的結果。嘗試在虛擬服務器上自己運行並親自查看。您的後端可能會錯誤地進行解析。 –