         case custom
     }
 
-    public enum CodingKeys: String, CodingKey {
+    public enum CodingKeys: String, CodingKey, JSONSubscriptType {
         case typeName
         case contentType
         case presets
         case data
+
+        public var jsonKey: JSONKey {
+            return .key(rawValue)
+        }
     }
 }
 

    /// - Returns: A deserialized instance of this component type
    /// - Throws: Any type of error during deserialization.
    public init(json: JSON) throws {
        guard let name = json["typeName"].string else {
            throw DeserializationError.invalidSerialized(message: "Missing 'typeName'")
        }
        guard let type = json["contentType"].string else {
            throw DeserializationError.invalidSerialized(message: "Missing 'contentType'")
        }
        guard let contentType = ContentType(rawValue: type) else {
            throw DeserializationError.invalidSerialized(message: "Invalid content type \(type)")
        }
        if json["data"].type == .null || json["data"].type == .unknown {
            throw DeserializationError.invalidSerialized(message: "Missing 'data'")
        }
        if let presets = json["presets"].array {
            self.presets = try presets.map { try SerializedPreset(json: $0) }
        } else {
            self.presets = []

        
        self.typeName = name
        self.contentType = contentType
        self.data = json[CodingKeys.data]
    }
    
    fileprivate init() {
