     /// - throws: One of the `JSON.Error` cases thrown by `decode(_:type:)`.
     /// - seealso: `JSON.decode(_:type:)`
     public func string(first: PathFragment, _ rest: PathFragment...) throws -> Swift.String {
-        return try decodedAtPath(first, rest)
+        return try mapAtPath(first, rest) { try $0.string() }
     }
 
     /// Retrieves a `Bool` from a path into JSON.

        return try? valueAtPath(path, detectNull: false)
    }

    // MARK: Simple member unpacking

    private func fetchValueAtPath<Value>(first: PathFragment, _ rest: [PathFragment], @noescape getter: JSON throws -> Value) throws -> Value {
        var path = rest
        path.insert(first, atIndex: path.startIndex)
        let json = try valueAtPath(path, detectNull: false)
        return try getter(json)
    }

    private func decodedAtPath<Decoded: JSONDecodable>(first: PathFragment, _ rest: [PathFragment]) throws -> Decoded {
        return try fetchValueAtPath(first, rest, getter: Decoded.init)
    }

    /// Attempts to decode into the returning type from a path into JSON.

    /// - throws: One of the `JSON.Error` cases thrown by `decode(_:type:)`.
    /// - seealso: `JSON.decode(_:type:)`
    public func array(first: PathFragment, _ rest: PathFragment...) throws -> [JSON] {
        return try mapAtPath(first, rest) { try $0.array() }
    }

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