Skip to content

mstfy/Nolan

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

##Nolan

Nolan is a library that converts swift 2 values into JSON format. It can convert any type (except functions and tuples) to JSON object. It uses protocol extensions, error handling that is only available in swift version 2.

###Requirements

  • Swift 2
  • Xcode 7

###Installation

Nolan supports Carthage. Add github "mstfy/Nolan" line into your Cartfile and run carthage install command on terminal.

###How to use By default Nolan can convert String, NSDate, Float, Double, Int, NSURL and Optional types to json. To adopt it for your custom type just conform your type to JSONConvertible protocol and it is done (hopefully). Here is an example type:

struct User: JSONConvertible {
    let name: String
    let age: Int
}

Now to convert it to JSON just call toJSON() method that is declared in JSONConvertible protocol.

let user = User(name: "Nolan", age: 25)
try {
    let userJSON = try user.toJSON()
    print("user converted to \(userJSON)")
} catch let JSONConversionError.TypeIsNotConvertibleToJSON(type) {
    print("Error: \(type) is not convertible to JSON")
}

Here is more complicated example:

struct User: JSONConvertible {
    let name: String
    let books: [Book]
}

struct Book: JSONConvertible {
    let name: String
    let author: String
    let publisher: String?
}

let books = [Book(name: "The Lord Of the Rings", author: "J.R.R. Tolkien", publisher: "George Allen"), Book(name: "When Nietzsche Wept", author: "Irvin D. Yalom", publisher: nil)]
let user = User(name: "Cooper", books: books)

do {
	let userJson = try user.toJSON()
	print("user json is \(userJson)")
} catch let JSONConversionError.TypeIsNotConvertibleToJSON(type) {
    print("Error: \(type) is not convertible to JSON")
} catch let error as NSError {
    print("unknown error \(error.localizedDescription)")
}

It prints:

user json is {
    books =     (
                {
            author = "J.R.R. Tolkien";
            name = "The Lord Of the Rings";
            publisher = "George Allen";
        },
                {
            author = "Irvin D. Yalom";
            name = "When Nietzsche Wept";
            publisher = "<null>";
        }
    );
    name = Cooper;
}

By default toJSON method produces key value pairs of the value using reflection api in Swift. But you can override this behavior in your custom type. For example:

struct User: JSONConvertible {
	let name: String
	let role: Role
}

enum Role: JSONConvertible {
	case Pilot
	case Captain
	
	func toJSON() throws -> JSON {
	    switch self {
	    case .Pilot: return "pilot"
	    case .Captain: return "captain"
	    }
	}
}

let user = User(name: "Cooper", role: .Captain)
do {
    let userJSON = try user.toJSON()
    print("user json = \(userJSON)")
} catch let JSONConversionError.TypeIsNotConvertibleToJSON(type) {
    print("Error: \(type) is not convertible to JSON")
} catch let error as NSError {
    print("unknown error \(error.localizedDescription)")
}

It prints:

user json = {
    name = Cooper;
    role = captain;
}

About

Converts swift values into JSON

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published