[英]Convert swift struct to json string
我正在嘗試將我的swift結構轉換為json格式。 似乎有很多這樣的問題,但是到目前為止,沒有一種解決方案對我有用。
這是我的結構
struct Rec : Codable {
var name:String
var time:Int
var values:[String]
var jsonRepresentation : String {
return """
{
"name":"\(name)",
"time":\(time),
"values":\(values)
}
"""
}
}
這是外部api接收的json格式。
{
"op" : "delete",
"rec": {
"name" : "some string",
"time":200,
"values": [
"127.0.0.1"
]
}
}
這是我創建HTTP請求的函數
private func createPatchRequest(op: String, url: URL, rec: Rec) throws -> URLRequest {
let dictionary: [String: String] = [
"op":op,
"rec":rec.jsonRepresentation
]
let jsonData = try JSONEncoder().encode(dictionary)
var request = URLRequest(url: url)
request.httpMethod = "PATCH"
request.httpBody = jsonData
request.addValue("application/json", forHTTPHeaderField:"Content-Type")
return request
}
我總是得到400,我相信swift不能正確編碼我的json。 我在郵遞員上嘗試了該請求,效果很好!
這是郵遞員的樣子
{
"op" : "delete",
"rec": {
"name" : "some string",
"time":600,
"values": [
"127.0.0.1"
]
}
}
有任何想法嗎? 謝謝!
問題在於該API期望rec
是一個JSON對象,但是您正在將Rec作為JSON對象的字符串表示形式發送。 即這是您要發送的JSON:
{
"rec": "{\n\"name\":\"some string\",\n\"time\":1,\n\"values\":[\"127.0.0.1\"]\n}",
"op": "delete"
}
理想的方法是使用嵌套的Rec
結構創建一個Codable
PatchRequest
並對其進行編碼。 您可以在Playground上嘗試以下代碼段
struct Rec : Codable {
var name:String
var time:Int
var values:[String]
}
struct PatchRequest : Codable{
var op: String
var rec: Rec
}
let rec = Rec(name: "some string",time: 600,values: ["127.0.0.1"])
let requst = PatchRequest(op: "delete",rec: rec)
let jsonData = try JSONEncoder().encode(requst)
let jsonString = String(data: jsonData, encoding: .utf8)
這具有減少API方法所需的參數數量以及使代碼整體更整潔的額外好處:
private func createPatchRequest(url: URL, patchRequest: PatchReuest) throws -> URLRequest {
let jsonData = try JSONEncoder().encode(patchRequest)
var request = URLRequest(url: url)
request.httpMethod = "PATCH"
request.httpBody = jsonData
request.addValue("application/json", forHTTPHeaderField:"Content-Type")
return request
}
最后,除非絕對必要,否則我建議在您的結構中使用let
而不是var
。
您的jsonRepresentation是一個字符串,但應該是一個字典 。 通過以下方式更新您的結構:
struct Rec : Codable {
var name:String
var time:Int
var values:[String]
var jsonRepresentation: [String: Any] {
return [
"name": name,
"time": time,
"values": values
]
}
}
希望能幫助到你! 請讓我知道它是否有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.