Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

🏹 Parse JSON with style

License

NotificationsYou must be signed in to change notification settings

freshOS/Arrow

Repository files navigation

Arrow

Arrow

Language: Swift 6Platform: iOS 8+SPM compatibleBuild Statuscodebeat badgeLicense: MITRelease version

Reason -Example -Installation

identifier<--json["id"]name<--json["name"]stats<--json["stats"]

Because parsing JSON in Swift is full ofunecessary if lets, obvious casts and nil-checks
There must be a better way

Try it

Arrow is part offreshOS iOS toolset. Try it in an example App!Download Starter Project

How

By using a simple arrow operator that takes care of the boilerplate code for us.
Json mapping code becomesconcise andmaintainable ❤️

Why use Arrow

  • Infers types
  • Leaves your models clean
  • Handles custom & nested models
  • Dot and array syntax
  • Pure Swift, Simple & Lightweight

Example

Swift Model

structProfile{varidentifier=0varname=""varlink:NSURL?varweekday:WeekDay=.Mondayvarstats=Stats()varphoneNumbers=[PhoneNumber]()}

JSON File

{"id":15678,"name":"John Doe","link":"https://apple.com/steve","weekdayInt" :3,"stats": {"numberOfFriends":163,"numberOfFans":10987    },"phoneNumbers": [{"label":"house","number":"9809876545"                     }, {"label":"cell","number":"0908070656"                     }, {"label":"work","number":"0916570656"    }]}

Before (Chaos)

varprofile=Profile()// Intiflet id=json["id"]as?Int{    profile.identifier= id}  // Stringiflet name=json["name"]as?String{    profile.name= name}// NSURLiflet link=json["link"]as?String, url=NSURL(string:link){    profile.link= link}// Enumif let weekdayInt=json["weekdayInt"]as?Int, weekday=WeekDay(rawValue:weekdayInt){    profile.weekday= weekday}// Custom nested objectif let statsJson=json["stats"]as?AnyObject{iflet numberOfFans=statsJson["numberOfFans"]as?Int{        profile.stats.numberOfFans= numberOfFans}iflet numberOfFriends=statsJson["numberOfFriends"]as?Int{        profile.stats.numberOfFriends= numberOfFriends}}// Array of custom nested objectif let pns=json["phoneNumbers"]as?[AnyObject]{forpnin pns{        phoneNumbers.append(PhoneNumber(json: pn))}}

After 🎉🎉🎉

extensionProfile:ArrowParsable{mutatingfunc deserialize(_ json:JSON){        identifier<--json["id"]        link<--json["link"]        name<--json["name"]        weekday<--json["weekdayInt"]        stats<-json["stats"]        phoneNumbers<--json["phoneNumbers"]}}

Usage

letprofile=Profile()profile.deserialize(json)

Installation

The Swift Package Manager (SPM) is now the official way to installArrow. The other package managers are now deprecated as of5.1.2 and won't be supported in future versions.

Swift Package Manager

Xcode >File >Swift Packages >Add Package Dependency... >Pastehttps://github.com/freshOS/Arrow

Carthage - Deprecated

github "freshOS/Arrow"

CocoaPods - Deprecated

target 'MyApp'pod 'Arrow'use_frameworks!

How Does That Work

Notice earlier we typed :

stats<--json["stats"]

That's because we created and extension "Stats+Arrow.swift" enabling us to use the Arrow Operator

//  Stats+Arrow.swiftimport FoundationextensionStats:ArrowParsable{mutatingfunc deserialize(json:JSON){        numberOfFriends<--json["numberOfFriends"]        numberOfFans<--json["numberOfFans"]}}

Flexible you said

  • DO I have to use the <-- for my sub models
  • Nope, you could write it like so if you wanted :
stats.numberOfFriends<--json["stats.numberOfFriends"]stats.numberOfFans<--json["stats.numberOfFans"]

Date Parsing

Globally

// Configure Global Date Parsing with one of thoseArrow.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ")Arrow.setUseTimeIntervalSinceReferenceDate(true)Arrow.setDateFormatter(aDateFormatter)// Then later dates can be parsed form custom date format or timestamps automatically 🎉letjson:JSON=JSON(["date":"2013-06-07T16:38:40+02:00","timestamp":392308720])date1<--json["date"]date2<--json["timestamp"]

On a per-key basis

createdAt<--json["created_at"]?.dateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ")createdAt<--json["created_at"]?.dateFormatter(aCustomDateFormatter)

Just provide it on a case per case basis ! 🎉

Accessing JSON values

Nested values

value<--json["nested.nested.nested.nestedValue"]

Object at index

value<--json[12]

Combine both

value<--json[1]?["someKey"]?[2]?["something.other"]

Looping on Array

iflet collection= json.collection{forjsonEntryin collection{        //Do something}}

Swift Version

Acknowledgements

This wouldn't exist withoutYannickDot,Damien-nd andmaxkonovalov

Backers

Like the project? Offer coffee or support us with a monthly donation and help us continue our activities :)

Sponsors

Become a sponsor and get your logo on our README on Github with a link to your site :)


[8]ページ先頭

©2009-2025 Movatter.jp