Swift 4 Decodable:给定数据无效JSON

前端之家收集整理的这篇文章主要介绍了Swift 4 Decodable:给定数据无效JSON前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试向本地服务器写一个POST请求,这是我的功能
@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
        }
   } 
}

我做了一些谷歌搜索,但我被困在这里很长一段时间!
任何帮助赞赏!

这很简单..我有同样的问题..

看看您的Struct是解码和编码时间戳,纬度和经度,就像字符串和JSON是Double或Floating类型一样.

struct MessageForPost:Codable {
    let message: String
    let timestamp: String
    let latitude: String
    let longitude: String
}

而在这里Json

{
    data: {
        message: {

            message: “Hey,longitude: 25.735066461654696
        }
   } 
}

….我把它固定在我的最后……它工作了..

编辑使用相同的数据类型..

猜你在找的Swift相关文章