     public func get(formatter: DateFormatter, path: String? = nil) throws -> Date {
         let string: String = try self.get(path: path)
         guard let date = formatter.date(from: string) else {
-            throw QJsonError.cast(path: self.buildPath(path: path))
+            throw QJsonError.cast(path: self.buildPath([ path ]))
         }
         return date
     }
 
     public func get< Type: IQJsonValue >(path: String? = nil) throws -> Type {
         let jsonValue: Any = try self.get(path: path)
-        return try Type.fromJson(value: jsonValue, path: self.buildPath(path: path)) as! Type
+        return try Type.fromJson(value: jsonValue, path: self.buildPath([ path ])) as! Type
     }
 
     public func get< Type: IQJsonValue >(mandarory: Bool, path: String? = nil) throws -> [Type] {
         let jsonValue: Any = try self.get(path: path)
         guard let jsonArray = jsonValue as? NSArray else {
-            throw QJsonError.cast(path: self.buildPath(path: path))
+            throw QJsonError.cast(path: self.buildPath([ path ]))
         }
         var result: [Type] = []
         var index: Int = 0
         for jsonItem in jsonArray {
-            let subpath = self.buildPath(path: path, index: index)
+            let subpath = self.buildPath([ path, index ])
             if mandarory == true {
                 let item = try Type.fromJson(value: jsonItem, path: subpath) as! Type
                 result.append(item)

            }
            return subpath
        })
    }

    private func buildPath(path: String?) -> String {
        if let path = path {
            if self.basePath.count > 0 {
                return "\(self.basePath).\(path)"
            }
            return path
        }
        return self.basePath
    }

    private func buildPath(path: String?, index: Int) -> String {
        if let path = path {
            if self.basePath.count > 0 {
                return "\(self.basePath).\(path)[\(index)]"
            }
            return "\(path)[\(index)]"
        }
        if self.basePath.count > 0 {
            return "\(self.basePath)[\(index)]"
        }
        return "[\(index)]"
    }

    private func buildPath(path: String?, key: Any) -> String {
        if let path = path {
            if self.basePath.count > 0 {
                return "\(self.basePath).\(path).\(key)"
            }
            return "\(path).\(key)"
        }
        if self.basePath.count > 0 {
            return "\(self.basePath).\(key)"
        }
        return "\(key)"
    }

    private func buildPath(subpaths: [IQJsonPath], from: Int, to: Int) -> String {
        var path = self.basePath
        Array< IQJsonPath >(subpaths[from..<to]).forEach({
            if let string = $0.jsonPathKey {
                if path.count > 0 {
                    path.append(".\(string)")
                } else {
                    path.append(string)
                }
            } else if let number = $0.jsonPathIndex {
                path.append("[\(number)]")
            }
        })
        return path
    }

    private func set(_ value: Any?, subpaths: [IQJsonPath]) throws {

                    }
                    root = mutable
                } else {
                    throw QJsonError.access(path: self.buildPath(subpaths, from: 0, to: subpathIndex))
                }
                if subpathIndex == subpaths.endIndex - 1 {
                    if let value = value {
