         var debugDescription: String {
             return "\(path)\n\(jayson)"
         }
+    }
+}
+
+extension JAYSON {
+    
+    public subscript (key: String) -> JAYSON? {
+        return (source as? [AnyHashable : Any])
+            .flatMap { $0[key] }
+            .map { JAYSON(source: $0, breadcrumb: Breadcrumb(jayson: self, key: key)) }
+    }
+    
+    public subscript (index: Int) -> JAYSON? {
+        return (source as? [Any])
+            .flatMap { $0[index] }
+            .map { JAYSON(source: $0, breadcrumb: Breadcrumb(jayson: self, index: index)) }
     }
 }
 

        return value
    }
    
    public func getArray() throws -> [JAYSON] {
        guard let value = source as? [Any] else {
            throw JAYSONError.FailedToGetArray(source, self)

    case FailedToGetBool(Any, JAYSON)
    case FailedToGetNumber(Any, JAYSON)
    case FailedToGetArray(Any, JAYSON)
    case InvalidJSONObject
}

public struct JAYSON: CustomDebugStringConvertible {
