代码之家  ›  专栏  ›  技术社区  ›  Kamran

将可编码/可编码转换为JSON对象swift

  •  -2
  • Kamran  · 技术社区  · 6 年前

    最近我注册了 Codable 在一个项目中 JSON 来自符合以下条件的类型的对象 Encodable 我提出了这个扩展,

    extension Encodable {
    
        /// Converting object to postable JSON
        func toJSON(_ encoder: JSONEncoder = JSONEncoder()) -> [String: Any] {
            guard let data = try? encoder.encode(self) else { return [:] }
            guard let object = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) else { return [:] }
            guard let json = object as? [String: Any] else { return [:] }
            return json
        }
    }
    

    这很有效,但是有没有更好的方法来达到同样的效果呢?我觉得经常打电话给 jsonObject(with: 对于大的对象 data .

    1 回复  |  直到 6 年前
        1
  •  1
  •   vadian    6 年前

    我的建议是命名函数 toDictionary 并将可能的错误移交给调用者。条件向下强制转换失败(类型不匹配)被包装在 typeMismatch 判定元件 编码错误。

    extension Encodable {
    
        /// Converting object to postable dictionary
        func toDictionary(_ encoder: JSONEncoder = JSONEncoder()) throws -> [String: Any] {
            let data = try encoder.encode(self)
            let object = try JSONSerialization.jsonObject(with: data)
            guard let json = object as? [String: Any] else {
                let context = DecodingError.Context(codingPath: [], debugDescription: "Deserialized object is not a dictionary")
                throw DecodingError.typeMismatch(type(of: object), context)
            }
            return json
        }
    }
    
    推荐文章