Как преобразовать словарь в JSON в Vapor 3?

В Vapor 1.5 я использовал для преобразования словаря в JSON, как показано ниже.
Как мне это сделать в Vapor 3.1? В документации говорится, что мне нужно создать тип структуры и согласовать его с кодируемым протоколом.
Есть ли другой метод, который позволил бы преобразовать существующий словарь без создания новой структуры?

   func makeCustomJSON(clientData: DataFromClientChargeWithCard, paymentID:String,customer: String) throws -> JSON {



    var dictionaryOfStrings = [String:String]()


    dictionaryOfStrings["BookingState"] = "Active"
    dictionaryOfStrings["BookingStateTimeStamp"] = clientData.TimeStampBookingSavedInDB

    dictionaryOfStrings["ChangesMadeBy"] = "User"
    dictionaryOfStrings["PaymentID"] = paymentID
    dictionaryOfStrings["DateAndTime"] = clientData.DateAndTime
    dictionaryOfStrings["RatePriceClient"] = clientData.RatePriceClient
    dictionaryOfStrings["Locality"] = clientData.Locality
    dictionaryOfStrings["StripeCustomerID"] = customer

    //some more properties below...

    let response:JSON
    do {
        response = try JSON(node: dictionaryOfStrings)
    }catch let error as NSError {
        let message = "dictionaryOfStrings can't be converted in JSON"
        drop.log.error(message)
        logErr.prints(message: message, code: error.code)
        throw NSError(domain: "errorDictionary", code: 400, userInfo: ["error" : error.localizedDescription])
    }
    return response
 }

1 ответ

Решение

Если у вас есть тип, подобный структуре, которую я определил здесь, вы можете просто вернуть ее, если она соответствует Content,

import Vapor
import FluentSQLite

struct Employee: Codable {
    var id: Int?
    var name: String

    init(name:String) {
        self.name = name
    }
}

extension Employee: SQLiteModel {}

extension Employee: Migration {}

extension Employee: Parameter {}

extension Employee: Content { }

и тогда вы можете просто определить маршрут и вернуть его.

router.get("test") { req in
    return Employee(name: "Alan")
}

если вы хотите использовать словарь, вы можете использовать JSONSerialization и вернуть строку.

router.get("test2") { req -> String in

    let employeeDic: [String : Any] = ["name":"Alan", "age":27]

    do {
        let data = try JSONSerialization.data(withJSONObject: employeeDic, options: .prettyPrinted)
        let jsonString = String(data: data, encoding: .utf8)
        return jsonString ?? "FAILED"

    }catch{
        return "ERROR"
    }
}
Другие вопросы по тегам