Как преобразовать сохраненные значения в формат JSON с помощью Swift? - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь преобразовать сохраненные значения coredata в формат JSON, а значение формата JSON необходимо назначить одной переменной, потому что это сгенерировало JSON Мне нужно отправить на сервер. Ниже кода я пытался получить сохраненные значения coredata, но не знаю, как сгенерировать JSON требуемый формат.

Получение значений из coredata

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "User")
    do {
        let results = try context.fetch(fetchRequest)
        let  dateCreated = results as! [Userscore]
            for _datecreated in dateCreated {
                print("\(_datecreated.id!)-\(_datecreated.name!)") // Output: 79-b \n 80-c \n 78-a
            }
   } catch let err as NSError {
        print(err.debugDescription)
}

Необходимо преобразовать значение Coredata в формат ниже JSON

{
    "status": true,
    "data": [
        {
            "id": "20",
            "name": "a"
        },
        {
            "id": "21",
            "name": "b"
        },
        {
            "id": "22",
            "name": "c"
        }
    ]
}

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Вы можете использовать свойства Encodable, чтобы это произошло. Это дает дополнительное преимущество: не прибегайте к типу Any.

Для JSON вы можете использовать следующие типы:

struct JSONMessage: Encodable {
    var status: Bool
    var data: [JSONDataEntry]
}

struct JSONDataEntry: Encodable {
    var id: String
    var name: String
}

Затем вы можете настроить свой do / попробуйте / поймайте следующим образом:

do {
    let results = try context.fetch(fetchRequest)
    let  dateCreated = results as! [Userscore]
    // *starting here*
    let data = dateCreated.map { JSONDataEntry(id: String($0.id!), name: $0.name!) }
    let status = true   // <- not sure where status comes from, so adding here
    let message = JSONMessage(status: status, data: data)
    let jsonData = try JSONEncoder().encode(message)
    if let json = String(data: jsonData, encoding: .utf8) {
        // do something with the JSON string
        print(json)
    }
    // *ending here*
} catch let err as NSError {
    print(err.debugDescription)
}
0 голосов
/ 08 января 2020

Вероятно, самым простым является преобразование вашего объекта (ей) в словари или массивы (в зависимости от того, что вам нужно).

Сначала вы должны иметь возможность преобразовать Userscore в словарь. Я буду использовать расширение для него, поскольку я понятия не имею, как выглядит ваша сущность:

extension Userscore {

    func toDictionary() -> [String: Any]? {
        guard let id = id else { return nil }
        guard let name = name else { return nil }
        return [
            "id": id,
            "name": name
        ]
    }

}

Теперь этот метод можно использовать для создания массива ваших словарей, просто используя let arrayOfUserscores: [[String: Any]] = userscores.compactMap { $0.toDictionary() }.

* 1009. * Или создать целое JSON, как указано в вопросе:
func generateUserscoreJSON(userscores: [Userscore]) -> Data? {
    var payload: [String: Any] = [String: Any]()
    payload["status"] = true
    payload["data"] = userscores.compactMap { $0.toDictionary() }
    return try? JSONSerialization.data(withJSONObject: payload, options: .prettyPrinted)
}

Теперь будут созданы необработанные данные, готовые для отправки на сервер, например

var request = URLRequest(url: myURL)
request.httpBody = generateUserscoreJSON(userscores: userscores)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...