     ///   any error that arises from decoding the contained values.
     /// - seealso: `JSON.decode(_:or:)`
     public func arrayOf<Decoded: JSONDecodable>(path: PathFragment..., @autoclosure or fallback: () -> [Decoded]) throws -> [Decoded] {
-        let array = try optionalAtPath(path, ifNotFound: true) { try $0.array() }
-        return try array?.map(Decoded.init) ?? fallback()
+        return try mapOptionalAtPath(path, fallback: fallback) { try $0.arrayOf() }
     }
 
     /// Retrieves a `[String: JSON]` from a path into JSON or a fallback if not

    /// - throws: One of the `JSON.Error` cases thrown by `decode(_:or:)`.
    /// - seealso: `JSON.decode(_:or:)`
    public func string(path: PathFragment..., @autoclosure or fallback: () -> Swift.String) throws -> Swift.String {
        return try decodedAtPath(path, or: fallback)
    }

    /// Retrieves a `Bool` from a path into JSON or a fallback if not found.

    /// - throws: One of the `JSON.Error` cases thrown by `decode(_:or:)`.
    /// - seealso: `JSON.decode(_:or:)`
    public func array(path: PathFragment..., @autoclosure or fallback: () -> [JSON]) throws -> [JSON] {
        return try mapOptionalAtPath(path, fallback: fallback) { try $0.array() }
    }

    /// Attempts to decodes many values from a desendant JSON array at a path
