解析来自服务器 Swift 的 JSON 数据时出现问题

时间:2021-07-08 15:09:41

标签: ios swift nshttpurlresponse

我正在尝试解析来自服务器的数据,但出现此错误:

failure(Swift.DecodingError.typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead.", underlyingError: nil)))

参数应作为对象数组以及响应对象传递。我不知道我应该在我的代码中更改什么,以便响应结构良好。 这是响应的样子:

[
  {
   'code' : number, 
   'error' => boolean, 
   'code_error' => number, 
   'data_error' => string, 
   'message' => 'Falta Campo requerido'
  }
]

这些是应该传递的参数:

[
   {
      'email' => 'required|string|email',
      'event_type' => 'required|string',
      'watermark' => 'required|string',
      'date' => 'required',
      'location' => 'required|string',
      'segment' => 'required',
      'time' => 'required',
      'country' => 'required',
      'city' => 'required'
    }
]

这就是我的代码的样子。

数据:

struct MarcaAguaResData: Codable {
    let code: Int
    let error: Bool
    let message: String
}

struct MarcaAguaErrorResponse: Decodable, LocalizedError {
    let code: Int
    let error: Bool
    let message: String
    let code_error: Int
    let data_error: String
}

服务器:

class MarcaAguaService {
    func marcaAgua(parameters: [String: Any],
                completion: @escaping (Result<MarcaAguaResData, Error>)-> Void) {
    
    let urlString =  baseUrl + "events"
    
    guard let url = URL(string: urlString) 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
    
    let queryItemsData = components.query?.data(using: .utf8)
    
    request.httpBody = queryItemsData
    request.httpMethod = "POST"
    request.setValue("Bearer \(token_login)", forHTTPHeaderField: "Authorization")
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    
    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
            }
            
            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: .allowFragments)
                    print("BBBB")
                    print(json)
                    
                    if let successRes = try? JSONDecoder().decode(MarcaAguaResData.self, from: unwrappedData){
                        completion(.success(successRes))
                    }else{
                      
                        let errorResponse = try JSONDecoder().decode(MarcaAguaErrorResponse.self, from: unwrappedData)
                        print("Error \(errorResponse)")
                        completion(.failure(errorResponse))
                    }
                }catch{
                    print("AAA")
                    completion(.failure(error))
                }
            }
        }
    }
    task.resume()
}
}

1 个答案:

答案 0 :(得分:1)

成为import time import logging import threading import PySimpleGUI as sg cp = sg.cprint def main(): sg.theme('DarkAmber') col1 = [[sg.Button('start countdown', button_color='white on green', size=(18, 5), font=('Arial', 30, 'bold'))], [sg.Button('Buzzer Stop', button_color='red', font=('Arial', 30, 'bold'), size=(18, 5)) ]] col2 = [[sg.Multiline(size=(100, 2), key='-AB-', font=('Arial', 50, 'bold'), reroute_stdout=True, write_only=True, reroute_cprint=False)], [sg.Multiline(size=(100, 6), key='-ML-', autoscroll=True, reroute_stdout=True, write_only=True, reroute_cprint=True)] ] layout_test = [[sg.Column(col1, element_justification='c'), sg.Column(col2, element_justification='c')]] window = sg.Window('Counter', layout_test, size=(800, 480)) while True: event, values = window.read() cp(event, values) if event == sg.WIN_CLOSED or event == 'Exit': break if event.startswith('start countdown'): t = 900 t1 = threading.Thread(target=countdown, args=(t, window), daemon=True).start() if event.startswith('Buzzer Stop'): threading.Thread(target=Samplingthread, args=(window,), daemon=True).start() Buzzerflag = 60 window.close() def countdown(t, window): while t: mins, secs = divmod(t, 60) timer = '{:02d}:{:02d}'.format(mins, secs) window['-AB-'].print(timer) time.sleep(1) t -= 1 if __name__ == '__main__': main() 是一个数组而不是[MarcaAguaResData].self是一个字典

MarcaAguaResData.self

 if let successRes = try? JSONDecoder().decode([MarcaAguaResData].self, from: unwrappedData){
   completion(.success(successRes))
 }else{
    let errorResponse = try JSONDecoder().decode([MarcaAguaErrorResponse].self, from: unwrappedData)
    print("Error \(errorResponse)")
    completion(.failure(errorResponse))
 }
相关问题