如何在Swift 4中使用JSON对象发送JSON数据

3
我需要按以下顺序向服务器发送JSON。
data:{"firstname":"Alpha","lastname":"Beta"}

enter image description here

在这里,数据键位于json之外,例如[data:json],但是当我将其序列化时,请求会变成以下形式。
{
  "data" : {
    "firstname" : "alpha",
    "lastname" : "beta"
  }
}

这些是我的模型:
struct UserDetail :Codable {
    let data :CreateProfileModel
}

struct CreateProfileModel :Codable {
    let firstname :String
     let lastname :String
}

我正在这些模型中添加的数据

let profileInfo = CreateProfileModel(firstname: "alpha" , lastname: "beta")

let userDetails = UserDetail(data: profileInfo)

这是我使用Swift进行的JSON编码:
 let jsonEncoder = JSONEncoder()
 jsonEncoder.outputFormatting = .prettyPrinted
 do{
    let userData = try jsonEncoder.encode(userDetails)
     print(String(data: userData, encoding: .utf8)!)
     networkListener.requestPost(endpoint: endpoint, data: userData , headerValue: nil)
   }catch{
    print(error)
   }

在 requestPost 方法中

  func requestPost(endpoint : String , data :Data,headerValue : String?){....
  request.httpbody = data
}

我正在添加数据到request.httpbody中。
如何将数据键与profileInfo一起添加?

为什么不直接将JSON作为参数发送,而不将其放入字典中呢? - LinusGeffarth
2个回答

0
如果API需要(有效地)HTML表单数据,则需要自己构建主体并提取JSON的部分。
尝试:
let userData = try jsonEncoder.encode(userDetails.data)
let postBodyString = "data:\(userData)"
let postBodyData = postBodyString.data(using: String.Encoding.utf8)
networkListener.requestPost(endpoint: endpoint, data: postBodyData, headerValue: nil)

userData 是 Data 类型而不是 String,所以 post body 将会变成一个字符串,我无法将其作为 Data 传递给 requestPost 方法。 - imrohit

0

尝试这段代码:

var columnValus:[String:Any]  = [:]

columnValus["firstname"] = userDetails.data.firstname
columnValus["lastname"] = userDetails.data.lastname

let userData = [
      "data": columnValus
      ] as [String : Any]

  do {
      let postData = try JSONSerialization.data(withJSONObject: userData, options: [])
      networkListener.requestPost(endpoint: endpoint, data: postData , headerValue: nil)
  }catch let error as NSError {
      print(error)
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接