web-dev-qa-db-ja.com

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"}}}

しかし、このエラーが表示され続けます:

セッションエラー:dataCorrupted(Swift.DecodingError.Context(codingPath:[]、debugDescription: "指定されたデータは有効なJSONではありませんでした。"、undergroundError:Optional(Error Domain = NSCocoaErrorDomain Code = 3840 "JSONテキストは配列またはオブジェクトで始まっていませんフラグメントの設定を許可しないオプション。 "UserInfo = {NSDebugDescription = JSONテキストが配列またはオブジェクトで始まっていなかったため、フラグメントの設定を許可しないオプション})))

なぜ有効な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
        }
   } 
}

私はかなりのグーグルをしましたが、非常に長い間ここに残っています!どんな助けも感謝します!

9
Kei

それは簡単だった..私は同じ種類の問題を抱えていた..

構造体がタイムスタンプ、緯度と経度を文字列としてデコードおよびエンコードし、JSONがDoubleまたはFloatingタイプであるように見えます。

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

そして、ここでJson

{
    data: {
        message: {
            message: "Hey, a new message!",
            timestamp: 2017-09-10 10:22:33,
            latitude: 62.233589156441724,
            longitude: 25.735066461654696
        }
   } 
}

....私は最後にそれを修正し、そして...それは働いた..

編集済み同じデータ型を使用します。

1
MFarooqi