This repository was archived by the owner on May 17, 2024. It is now read-only.
- Notifications
You must be signed in to change notification settings - Fork90
A JSON deserialization library for Swift
License
NotificationsYou must be signed in to change notification settings
lyft/mapper
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Mapper is a simple Swift library to convert JSON to strongly typedobjects. One advantage to Mapper over some other libraries is you canhave immutable properties.
WithCocoaPods
use_frameworks!pod"ModelMapper"
WithCarthage
github "lyft/mapper"
import Mapper// Conform to the Mappable protocolstructUser:Mappable{letid:StringletphotoURL:URL? // Implement this initializerinit(map:Mapper)throws{try id= map.from("id") photoURL= map.optionalFrom("avatar_url")}}// Create a user!letJSON:NSDictionary=...letuser=User.from(JSON) // This is a 'User?'
enumUserType:String{case Normal="normal"case Admin="admin"}structUser:Mappable{letid:Stringlettype:UserTypeinit(map:Mapper)throws{try id= map.from("id")try type= map.from("user_type")}}
structUser:Mappable{letid:Stringletname:Stringinit(map:Mapper)throws{try id= map.from("id")try name= map.from("name")}}structGroup:Mappable{letid:Stringletusers:[User]init(map:Mapper)throws{try id= map.from("id") users= map.optionalFrom("users")??[]}}
extensionCLLocationCoordinate2D:Convertible{publicstaticfunc fromMap(_ value:Any)throws->CLLocationCoordinate2D{guardlet location= valueas?NSDictionary,let latitude=location["lat"]as?Double,let longitude=location["lng"]as?Doubleelse{throwMapperError.convertibleError(value: value, type:[String:Double].self)}returnCLLocationCoordinate2D(latitude: latitude, longitude: longitude)}}structPlace:Mappable{letname:Stringletlocation:CLLocationCoordinate2Dinit(map:Mapper)throws{try name= map.from("name")try location= map.from("location")}}letJSON:NSDictionary=["name":"Lyft HQ","location":["lat":37.7603392,"lng":-122.41267249999999,],]letplace=Place.from(JSON)
privatefunc extractFirstName(object:Any?)throws->String{guardlet fullName= objectas?Stringelse{throwMapperError.convertibleError(value: object, type:String.self)}letparts= fullName.characters.split{ $0==""}.map(String.init)iflet firstName= parts.first{return firstName}throwMapperError.customError(field:nil, message:"Couldn't split the string!")}structUser:Mappable{letfirstName:Stringinit(map:Mapper)throws{try firstName= map.from("name", transformation: extractFirstName)}}
structUser:Mappable{letname:StringletJSON:AnyObjectinit(map:Mapper)throws{ // Access the 'first' key nested in a 'name' dictionarytry name= map.from("name.first") // Access the original JSON (maybe for use with a transformation)try JSON= map.from("")}}
See the docstrings and tests for more information and examples.
These radars have affected the current implementation of Mapper
- rdar://23376350Protocol extensions with initializers do not work in extensions
- rdar://23358609Protocol extensions with initializers do not play well with classes
- rdar://23226135Can't conform to protocols with similar generic function signatures
- rdar://23147654Generic functions are not differentiated by their ability to throw
- rdar://23695200Using the
??
operator many times is unsustainable. - rdar://23697280Lazy collection elements can be evaluated multiple times.
- rdar://23718307Non final class with protocol extensions returning
Self
don't work
Mapper is maintained byLyft and released underthe Apache 2.0 license. See LICENSE for details
About
A JSON deserialization library for Swift
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
No packages published
Uh oh!
There was an error while loading.Please reload this page.
Contributors11
Uh oh!
There was an error while loading.Please reload this page.