Php 数据无法’;因为它是’;t的正确格式为Xcode 11
我收到了这个错误消息 “无法读取数据,因为它的格式不正确” post请求在PostMan中工作,因此错误必须在我的代码中,而不是在我的数据库中 我尝试了一些方法,但我是一个初学者,我被困在这里了 我有这样的json数据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
{ "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
}
同样,在jsondecoderdo 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
无法解析它。我希望你明白我的意思。对不起,我不明白。。。我是一个初学者,我是否需要更改用户模型以外的其他内容?正如@HammerClassNumUser
所述,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)))