簡體   English   中英

將swift結構轉換為json字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM