如何在Vapor 3中将Dictionary转换为JSON?

时间:2018-07-06 16:10:12

标签: swift vapor

在Vapor 1.5中,我曾经将Dictionary转换为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 个答案:

答案 0 :(得分: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"
    }
}