     }
 }
 
+public extension JSON {
+    public static func value<V: Outlaw.Value>(from string: String, using encoding: String.Encoding = .utf8) throws -> [V] {
+        guard let data = string.data(using: encoding) else {
+            throw OutlawError.typeMismatch(expected: Data.self, actual: String.self)
+        }
+        return try self.value(from: data)
+    }
+    
+    public static func value<V: Outlaw.Value>(from string: String, using encoding: String.Encoding = .utf8) -> [V]? {
+        return try? self.value(from: string, using: encoding)
+    }
+    
+    public static func value<K, V: Outlaw.Value>(from string: String, using encoding: String.Encoding = .utf8) throws -> [K: V] {
+        guard let data = string.data(using: encoding) else {
+            throw OutlawError.typeMismatch(expected: Data.self, actual: String.self)
+        }
+        return try self.value(from: data)
+    }
+    
+    public static func value<K, V: Outlaw.Value>(from string: String, using encoding: String.Encoding = .utf8) -> [K: V]? {
+        return try? self.value(from: string, using: encoding)
+    }
+    
+    public static func value<V: Outlaw.Value>(from string: String, using encoding: String.Encoding = .utf8) throws -> Set<V> {
+        guard let data = string.data(using: encoding) else {
+            throw OutlawError.typeMismatch(expected: Data.self, actual: String.self)
+        }
+        return try self.value(from: data)
+    }
+    
+    public static func value<V: Outlaw.Value>(from string: String, using encoding: String.Encoding = .utf8) -> Set<V>? {
+        return try? self.value(from: string, using: encoding)
+    }
+}
+
 // MARK: -
 // MARK: URL
 

    }
}

// MARK: -
// MARK: InputStream


        return try? self.value(from: url)
    }
}

public extension JSON {
    public static func value<V: Outlaw.Value>(from url: URL) throws -> [V] {
        let data = try Data(contentsOf: url)
        return try self.value(from: data)
    }
    
    public static func value<V: Outlaw.Value>(from url: URL) -> [V]? {
        return try? self.value(from: url)
    }
    
    public static func value<K, V: Outlaw.Value>(from url: URL) throws -> [K: V] {
        let data = try Data(contentsOf: url)
        return try self.value(from: data)
    }
    
    public static func value<K, V: Outlaw.Value>(from url: URL) -> [K: V]? {
        return try? self.value(from: url)
    }
    
    public static func value<V: Outlaw.Value>(from url: URL) throws -> Set<V> {
        let data = try Data(contentsOf: url)
        return try self.value(from: data)
    }
    
    public static func value<V: Outlaw.Value>(from url: URL) -> Set<V>? {
        return try? self.value(from: url)
    }
}
