Php 数据无法’;因为它是’;t的正确格式为Xcode 11

Php 数据无法’;因为它是’;t的正确格式为Xcode 11,php,json,swift,xcode,Php,Json,Swift,Xcode,我收到了这个错误消息 “无法读取数据,因为它的格式不正确” post请求在PostMan中工作,因此错误必须在我的代码中,而不是在我的数据库中 我尝试了一些方法,但我是一个初学者,我被困在这里了 我有这样的json数据 { "error":1, "NumUser":"179", "cFirstname":"test", "cEmail":"a@a.com", "cPassword":"$2y$10$uV.YUtyfyiDzUT/2HYS/dOmIg7vNVPrwNhcmbg5iFvHlVi1

我收到了这个错误消息

“无法读取数据,因为它的格式不正确”

post请求在PostMan中工作,因此错误必须在我的代码中,而不是在我的数据库中

我尝试了一些方法,但我是一个初学者,我被困在这里了

我有这样的json数据


{  "error":1, "NumUser":"179", "cFirstname":"test", "cEmail":"a@a.com", "cPassword":"$2y$10$uV.YUtyfyiDzUT/2HYS/dOmIg7vNVPrwNhcmbg5iFvHlVi1rEThuC"  } 

我使用swift从json获取数据

//
//  NetworkingService.swift
//  Database Login
//
//  Created by Kyle Lee on 2/17/19.
//  Copyright © 2019 Kilo Loco. All rights reserved.
//

import Foundation

enum MyResult<T, E: Error> {

    case success(T)
    case failure(E)
}

class NetworkingService {

    let baseUrl = "https://zzzway.com/appMango"

    func handleResponse(for request: URLRequest,
                        completion: @escaping (Result<User, Error>) -> Void) {

        let session = URLSession.shared

        let task = session.dataTask(with: request) { (data, response, error) in

            DispatchQueue.main.async {

                guard let unwrappedResponse = response as? HTTPURLResponse else {
                    completion(.failure(NetworkingError.badResponse))
                    return
                }

                print(unwrappedResponse.statusCode)

                switch unwrappedResponse.statusCode {

                case 200 ..< 300:
                    print("success")

                default:
                    print("failure")
                }

                if let unwrappedError = error {
                    completion(.failure(unwrappedError))
                    return
                }

                if let unwrappedData = data {

                    do {
                        let json = try JSONSerialization.jsonObject(with: unwrappedData, options: [])
                        print(json)

                        if let user = try? JSONDecoder().decode(User.self, from: unwrappedData) {
                            completion(.success(user))

                        } else {
                            let errorResponse = try JSONDecoder().decode(ErrorResponse.self, from: unwrappedData)
                            completion(.failure(errorResponse))
                        }

                    } catch {
                        completion(.failure(error))
                    }
                }
            }
        }

        task.resume()
    }

    func request(endpoint: String,
                 parameters: [String: Any],
                 completion: @escaping (Result<User, Error>) -> Void) {

        guard let url = URL(string: baseUrl) else {
            completion(.failure(NetworkingError.badUrl))
            return
        }

        var request = URLRequest(url: url)

        var components = URLComponents()

        var queryItems = [URLQueryItem]()

        for (key, value) in parameters {

            let queryItem = URLQueryItem(name: key, value: String(describing: value))
            queryItems.append(queryItem)
        }

        components.queryItems = queryItems

        // username=kiloloco&password=pass123
        let queryItemData = components.query?.data(using: .utf8)

        request.httpBody = queryItemData
        request.httpMethod = "POST"
        request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

        handleResponse(for: request, completion: completion)
    }

    func request(endpoint: String,
                 loginObject: Login,
                 completion: @escaping (Result<User, Error>) -> Void) {

        guard let url = URL(string: baseUrl) else {
            completion(.failure(NetworkingError.badUrl))
            return
        }

        var request = URLRequest(url: url)

        do {
            let loginData = try JSONEncoder().encode(loginObject)
            request.httpBody = loginData

        } catch {
            completion(.failure(NetworkingError.badEncoding))
        }

        request.httpMethod = "POST"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")

        handleResponse(for: request, completion: completion)
    }


}

enum NetworkingError: Error {
    case badUrl
    case badResponse
    case badEncoding
}


使用这个模型,你会得到你的回答。你的模型中有一个小错误。把你的模型和这个模型比较一下,你就会发现

struct User: Codable {
let error: Int?
let numUser, cFirstname, cEmail, cPassword: String?

enum CodingKeys: String, CodingKey {
    case error
    case numUser = "NumUser"
    case cFirstname, cEmail, cPassword
}

}如果您仍然有问题

更改:

struct User: Decodable {

    let error:Int
    let NumUser: Int
    let cFirstname: String
    let cEmail: String
    let cPassword: String

}
致:

这就是JSON的外观,它必须与您的模型匹配:

{
    "error": Int,
    "NumUser": String,
    "cFirstname": String,
    "cEmail": String,
    "cPassword": String
}
同样,在jsondecoder
do catch
中,您将在
catch
中得到一个错误,该错误将告诉您类似于:

Swift.DecodingError.typeMismatch(Swift.String, 
Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "NumUser", 
intValue: nil)], debugDescription: "Expected to decode Int but found an String 
instead.", underlyingError: nil)))

这实际上揭示了问题所在。您可以通过
print(error.localizedDescription)
来显示它,或者如果使用断点停止,您可以使用控制台中的
po error.localizedDescription
来显示您的用户模型。正是因为这个原因,您才得到这个错误。刚刚在您的模型中的endNumUser处添加了它,但是您在上面共享的响应是Int,它是以字符串形式出现的。这就是为什么您会得到这个问题,因为
JsonDecoder
无法解析它。我希望你明白我的意思。对不起,我不明白。。。我是一个初学者,我是否需要更改用户模型以外的其他内容?正如@HammerClass
NumUser
所述,type应该是
String
。但是您还有另一个问题与
JSON
结构相关。您得到的是无效的
JSON
,您可以将api返回的数据打印为
print(String(数据:unwrappedData,编码:.utf8)!)
,并在任何JSON中进行验证或将其包含在您的问题中。谢谢,我更改了我的用户结构。我也在控制台中打印了错误,但错误与以前相同,没有更具体的内容。“无法读取数据,因为它的格式不正确”
struct User: Decodable {

    let error:Int
    let NumUser: String
    let cFirstname: String
    let cEmail: String
    let cPassword: String

}
{
    "error": Int,
    "NumUser": String,
    "cFirstname": String,
    "cEmail": String,
    "cPassword": String
}
Swift.DecodingError.typeMismatch(Swift.String, 
Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "NumUser", 
intValue: nil)], debugDescription: "Expected to decode Int but found an String 
instead.", underlyingError: nil)))