                     }
                 }
             } else {
-                throw QJsonError.access(path: self.buildPath(subpaths: subpaths, from: 0, to: subpathIndex))
+                throw QJsonError.access(path: self.buildPath(subpaths, from: 0, to: subpathIndex))
             }
             subpathIndex += 1
             prevRoot = root
         }
+    }
+
+    private func buildPath(_ subpaths: [Any?]) -> String {
+        return self.buildPath(subpaths, from: subpaths.startIndex, to: subpaths.endIndex)
+    }
+
+    private func buildPath(_ subpaths: [Any?], from: Int, to: Int) -> String {
+        var path = self.basePath
+        Array< Any? >(subpaths[from..<to]).forEach({
+            guard let item = $0 else { return }
+            if let string = item as? String {
+                if path.count > 0 {
+                    path.append(".\(string)")
+                } else {
+                    path.append(string)
+                }
+            } else if let number = item as? NSNumber {
+                path.append("[\(number)]")
+            } else if let number = item as? UInt {
+                path.append("[\(number)]")
+            } else if let number = item as? Int {
+                path.append("[\(number)]")
+            }
+        })
+        return path
     }
 
     private struct Const {

    }

    public func set< Type: IQJsonValue >(_ value: Type, path: String? = nil) throws {
        let jsonValue = try value.toJsonValue(path: self.buildPath(path: path))
        try self.set(jsonValue, path: path)
    }


    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 ]))
        }
        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 ])) 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 ]))
        }
        var result: [Type] = []
        var index: Int = 0
        for jsonItem in jsonArray {
            let subpath = self.buildPath([ path, index ])
            if mandarory == true {
                let item = try Type.fromJson(value: jsonItem, path: subpath) as! Type
                result.append(item)
