POST-запрос Alamofire, заменяющий символы в выводе - PullRequest
0 голосов
/ 07 июня 2018

Я делаю этот запрос:

Alamofire.request(path,method:.post, parameters:params, encoding: JSONEncoding.default,headers:headers).responseJSON { response in
print("Result: \(response.result.value)"
do {
self.list = try JSONDecoder().decode([list].self, from: result!) for event in self.lists {
print(event.title," : ",event.description)
}

} catch let parseError as NSError {
print("JSON Error \(parseError.localizedDescription)")
}
}

Данные, которые должны выглядеть следующим образом (JSON?) - Вывод почтальона, все поля в нем не включены:

{
"start": "2016-02-01 11:30:00",
"end": "2016-02-01 14:42:24",
"id": 3192,
"ownership": false,
}

распечатываетвыглядит так в XCode:

{
start = "2016-02-01 11:30:00";
end = "2016-04-14 20:30:00";
"id" = 3192;
ownership = 0;
}

Результат: я не могу разобрать это с помощью JSONDecoder, ошибка:

"Не удалось прочитать данные, потому что это не так"t в правильном формате ".

Новичок в Swift ... так что, заранее спасибо за помощь!

Редактировать: Отредактировано для ясности с дополнительной информацией.Еще раз спасибо!

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Я могу предложить следующее решение:

Во-первых, вам нужен класс pojo для ссылки на ваш объект json.Самый простой способ, который я знаю, это библиотека SwiftyJSON (https://github.com/SwiftyJSON/SwiftyJSON), во-первых, вы можете добавить эту библиотеку в свой проект. Затем вы можете создать следующий класс pojo для вашего вывода ( необязательно : вы также можетеустановите SwiftyJSONAccelarator (https://github.com/insanoid/SwiftyJSONAccelerator) для генерации классов pojo с использованием выходных данных json.):

import Foundation
import SwiftyJSON

public class MyOutput: NSObject {

    // MARK: Declaration for string constants to be used to decode and also serialize.
    internal let kMyOutputEndKey: String = "end"
    internal let kMyOutputInternalIdentifierKey: String = "id"
    internal let kMyOutputOwnershipKey: String = "ownership"
    internal let kMyOutputStartKey: String = "start"


    // MARK: Properties
    public var end: String?
    public var internalIdentifier: Int?
    public var ownership: Bool = false
    public var start: String?


// MARK: SwiftyJSON Initalizers
/**
Initates the class based on the object
- parameter object: The object of either Dictionary or Array kind that was passed.
- returns: An initalized instance of the class.
*/
convenience public init(object: AnyObject) {
    self.init(json: JSON(object))
}

/**
Initates the class based on the JSON that was passed.
- parameter json: JSON object from SwiftyJSON.
- returns: An initalized instance of the class.
*/
public init(json: JSON) {
        end = json[kMyOutputEndKey].string
        internalIdentifier = json[kMyOutputInternalIdentifierKey].int
        ownership = json[kMyOutputOwnershipKey].boolValue
        start = json[kMyOutputStartKey].string

    }
}

После этого после вызова URL с помощью Alomofire и получения ответа вы можете просто отобразитьвывод в ваш класс pojo. Наконец, вы можете использовать любое поле в вашем классе (myOutput в моем примере):

Alamofire.request(path,method:.post, parameters:params, encoding: JSONEncoding.default,headers:headers).responseJSON { response in
            switch response.result {
            case .success(let value):
                let json = JSON(value)
                let myOutput = MyOutput.init(json: json)
                //use myOutput class for your needs
            case .failure( _):
                self.createNetworkErrorPopup()
            }
        }
0 голосов
/ 08 июня 2018

Alamofire не «заменяет символы на выходе», он дает вам другой объект , чем тот, который вы ожидаете.Если вы распечатаете тип вашего response.result, вы должны быть удивлены тем, что NSDictionary вы можете получить в этот момент.Наш надежный друг print(...) достаточно хорош, чтобы превратить это в String представление того, что вы передаете, но вы вряд ли сможете разобрать это, используя JSONDecoder, поскольку это , а не Data (это то, чего ожидает декодер).

Как я уже говорил: используйте responseString, чтобы получить ответ и превратить его в соответствующий Data для синтаксического анализа с использованием JSONDecoder.Чтобы иметь возможность правильно контролировать этот процесс, вы хотите включить в вопрос свой производный Codable и, скорее всего, установите стратегию разбора даты на JSONDecoder.

Без ваших struct икакой-то должным образом отформатированный JSON из вашего ответа (ну, Почтальон сделает, если он достаточно полон), мы вряд ли сможем помочь вам в дальнейшем.

PS: Не очень хорошая идея изменить ваш вопрос полностью через редактирование.Возможно, было бы лучше опубликовать новый вопрос и оставить комментарий с указателем на него на старый вопрос, чтобы люди, которые к нему вернутся, могли оказаться в нужном месте.Если вы обновляете свой вопрос, вы обычно должны оставить старый вопрос без изменений и дополнить его дополнительной информацией, чтобы сохранить актуальность существующего обсуждения.

0 голосов
/ 07 июня 2018

В качестве обходного пути вы можете просто добавить CodingKey в декодированную структуру.Просто добавьте в свою структуру / класс

private enum CodingKeys: String, CodingKey {
    case event_id = "id"
}

Пожалуйста, обратитесь к https://benscheirman.com/2017/06/swift-json/

...