将密码学与 ObjectMapper 结合使用

Using cryptography with ObjectMapper

我有一个 class,它被映射到 ObjectMapper。在过去,映射工作正常,但项目架构中的更改使 Double 的 Web 服务 return 字段变为具有加密值的 String

是否可以在映射期间解密并将 web 服务字段转换为我的 class 变量?

这就是我今天的收获:

class PosicaoConsolidada: Mappable {
    var portifolioBalance: Double!
    var families: [Family]!

    required init?(map: Map) {}

    public func mapping(map: Map) {
        portifolioBalance <- map["pointsBalance"]
        families <- map["fam"]
    }
}

这是我想做的事情:

class PosicaoConsolidada: Mappable {
    var portifolioBalance: Double!
    var families: [Family]!

    required init?(map: Map) {}

    public func mapping(map: Map) {
        portifolioBalance <- Double(Decryptor.decrypt(map["pointsBalance"]))
        families <- map["fam"]
    }
}

有几种方法可以完成数据解密。 ObjectMapper 提供协议 TransformType 来处理映射时的数据转换 (reference).

变形金刚:

import ObjectMapper

class PointsTransform: TransformType {
    typealias Object = Double
    typealias JSON = String

    func transformFromJSON(_ value: Any?) -> Object? {
        guard let encoded = value as? String
            else { return nil }

        // TODO: Replace with decoding logic
        return 239_584.938
    }

    func transformToJSON(_ value: Object?) -> JSON? {
        guard let decoded = value
            else { return nil }

        return "\(decoded)"
    }
}


型号:

class PosicaoConsolidada: Mappable {
    var portifolioBalance: Double!
    var families: [Family]!

    required init?(map: Map) {}

    public func mapping(map: Map) {
        portifolioBalance <- (map["pointsBalance"], PointsTransform())
        families <- map["fam"]
    }

}