All Projects → freshOS → Arrow

freshOS / Arrow

Licence: mit
🏹 Parse JSON with style

Programming Languages

swift
15916 projects

Projects that are alternatives of or similar to Arrow

Ws
⚠️ Deprecated - (in favour of Networking) ☁️ Elegantly connect to a JSON api. (Alamofire + Promises + JSON Parsing)
Stars: ✭ 352 (-0.85%)
Mutual labels:  json, micro-framework
Unbox
[Deprecated] The easy to use Swift JSON decoder
Stars: ✭ 1,985 (+459.15%)
Mutual labels:  json, decoding
Codability
Useful helpers for working with Codable types in Swift
Stars: ✭ 125 (-64.79%)
Mutual labels:  json, decoding
Himotoki
A type-safe JSON decoding library purely written in Swift
Stars: ✭ 786 (+121.41%)
Mutual labels:  json, decoding
Vscode Data Preview
Data Preview 🈸 extension for importing 📤 viewing 🔎 slicing 🔪 dicing 🎲 charting 📊 & exporting 📥 large JSON array/config, YAML, Apache Arrow, Avro, Parquet & Excel data files
Stars: ✭ 245 (-30.99%)
Mutual labels:  json, arrow
Kakajson
Fast conversion between JSON and model in Swift.
Stars: ✭ 867 (+144.23%)
Mutual labels:  json, mapping
Smoke
💨 Simple yet powerful file-based mock server with recording abilities
Stars: ✭ 142 (-60%)
Mutual labels:  json, simple
Fossurl
Your Own Url Shortner Without any fancy server side processing and support for custom url , which can even be hosted on GitHub Pages
Stars: ✭ 131 (-63.1%)
Mutual labels:  json, simple
Elixir Json
Native JSON library for Elixir
Stars: ✭ 216 (-39.15%)
Mutual labels:  json, decoding
Jsonlab
JSONLab: a native JSON/UBJSON/MassagePack encoder/decoder for MATLAB/Octave
Stars: ✭ 202 (-43.1%)
Mutual labels:  json, decoding
Codablealamofire
An extension for Alamofire that converts JSON data into Decodable objects.
Stars: ✭ 744 (+109.58%)
Mutual labels:  json, mapping
Serpent
A protocol to serialize Swift structs and classes for encoding and decoding.
Stars: ✭ 281 (-20.85%)
Mutual labels:  json, decoding
Encoding
Go package containing implementations of efficient encoding, decoding, and validation APIs.
Stars: ✭ 705 (+98.59%)
Mutual labels:  json, decoding
Lychee
The most complete and powerful data-binding library and persistence infra for Kotlin 1.3, Android & Splitties Views DSL, JavaFX & TornadoFX, JSON, JDBC & SQLite, SharedPreferences.
Stars: ✭ 102 (-71.27%)
Mutual labels:  json, mapping
Handyjson
A handy swift json-object serialization/deserialization library
Stars: ✭ 3,913 (+1002.25%)
Mutual labels:  json, mapping
Boo
Boo - A beautiful, clean and responsive theme for Ghost.
Stars: ✭ 176 (-50.42%)
Mutual labels:  json, simple
JSONUtilities
Easily load JSON objects and decode them into structs or classes
Stars: ✭ 57 (-83.94%)
Mutual labels:  mapping, decoding
Ikigajson
A high performance JSON library in Swift
Stars: ✭ 302 (-14.93%)
Mutual labels:  json, decoding
Pljson
PL/JSON is a generic JSON object written in PL/SQL. Using PL/SQL object syntax, users instantiate a JSON object and then add members, arrays and additional JSON objects. This object type can store JSON data, in Oracle, persistently.
Stars: ✭ 343 (-3.38%)
Mutual labels:  json
Agilemapper
A zero-configuration, highly-configurable, unopinionated object mapper with viewable execution plans. Flattens, unflattens, deep clones, merges, updates and projects queries. Targets .NET 3.5+ and .NET Standard 1.0+
Stars: ✭ 345 (-2.82%)
Mutual labels:  mapping

Arrow

Arrow

Language: Swift 5 Platform: iOS 8+ SPM compatible Carthage compatible Cocoapods compatible Build Status codebeat badge License: MIT Release version

Reason - Example - Installation

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

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

Try it

Arrow is part of freshOS 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 becomes concise and maintainable ❤️

Why use Arrow

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

Example

Swift Model

struct Profile {
    var identifier = 0
    var name = ""
    var link:NSURL?
    var weekday:WeekDay = .Monday
    var stats = Stats()
    var phoneNumbers = [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)

var profile = Profile()

// Int
if let id = json["id"] as? Int {
    profile.identifier = id
}  
// String
if let name = json["name"] as? String {
    profile.name = name
}
// NSURL
if let link = json["link"] as? String, url = NSURL(string:link)  {
    profile.link = link
}
// Enum
if let weekdayInt = json["weekdayInt"] as? Int, weekday = WeekDay(rawValue:weekdayInt) {
    profile.weekday = weekday
}
// Custom nested object
if let statsJson = json["stats"] as? AnyObject {
    if let numberOfFans = statsJson["numberOfFans"] as? Int {
        profile.stats.numberOfFans = numberOfFans
    }
    if let numberOfFriends = statsJson["numberOfFriends"] as? Int {
        profile.stats.numberOfFriends = numberOfFriends
    }
}
// Array of custom nested object
if let pns = json["phoneNumbers"] as? [AnyObject] {
    for pn in pns {
        phoneNumbers.append(PhoneNumber(json: pn))
    }
}

After 🎉🎉🎉

extension Profile:ArrowParsable {
    mutating func deserialize(_ json: JSON) {
        identifier <-- json["id"]
        link <-- json["link"]
        name <-- json["name"]
        weekday <-- json["weekdayInt"]
        stats <- json["stats"]
        phoneNumbers <-- json["phoneNumbers"]
    }
}

Usage

let profile = Profile()
profile.deserialize(json)

Installation

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

Swift Package Manager

Xcode > File > Swift Packages > Add Package Dependency... > Paste https://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.swift

import Foundation

extension Stats:ArrowParsable {
    mutating func 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 those
Arrow.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 🎉
let json: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

if let collection = json.collection {
    for jsonEntry in collection {
        //Do something
    }
}

Swift Version

  • Swift 2 -> version 2.0.3
  • Swift 3 -> version 3.0.5
  • Swift 4 -> version 4.0.0
  • Swift 4.1 -> version 4.1.0
  • Swift 4.2 -> version 4.2.0
  • Swift 5.0 -> version 5.0.0
  • Swift 5.1 -> version 5.1.0
  • Swift 5.1.3 -> version 5.1.1
  • Swift 5.3 -> version 6.0.0

Acknowledgements

This wouldn't exist without YannickDot, Damien-nd and maxkonovalov

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 :)

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].