File JSON Operations

Utility functions for reading and writing JSON files to disk.

← Back
Language: swift | Tags: file json persistence utilities
enum FileOperations {
    /// Read JSON file and decode
    static func readJSON<T: Decodable>(
        from filename: String,
        in directory: FileManager.SearchPathDirectory = .documentDirectory
    ) throws -> T {
        let url = try fileURL(for: filename, in: directory)
        let data = try Data(contentsOf: url)
        return try JSONDecoder().decode(T.self, from: data)
    }

    /// Write encodable object as JSON
    static func writeJSON<T: Encodable>(
        _ object: T,
        to filename: String,
        in directory: FileManager.SearchPathDirectory = .documentDirectory
    ) throws {
        let url = try fileURL(for: filename, in: directory)
        let data = try JSONEncoder().encode(object)
        try data.write(to: url, options: .atomic)
    }

    /// Get URL for file in directory
    static func fileURL(
        for filename: String,
        in directory: FileManager.SearchPathDirectory
    ) throws -> URL {
        guard let url = FileManager.default.urls(for: directory, in: .userDomainMask).first else {
            throw FileError.directoryNotFound
        }
        return url.appendingPathComponent(filename)
    }

    enum FileError: Error {
        case directoryNotFound
    }
}

// Usage:
// try FileOperations.writeJSON(user, to: "user.json")
// let user: User = try FileOperations.readJSON(from: "user.json")