Need help with Argo?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

3.5K Stars 209 Forks MIT License 363 Commits 14 Opened issues


Functional JSON parsing library for Swift

Services available


Need anything else?

Contributors list

Argo Carthage compatible Reviewed by Hound

Argo is a library that lets you extract models from JSON or similar structures in a way that's concise, type-safe, and easy to extend. Using Argo, you won't need to write validation code to ensure that incoming data is of the right type, or to make sure required data fields aren't turning up empty. Argo uses Swift's expressive type system to do that for you, and reports back explicit failure states in case it doesn't find what you've told it to expect.

Argo is the Greek word for swift and the name of the ship used by Jason, son of Aeson, of the Argonauts. Aeson is the JSON parsing library in Haskell that inspired Argo, much like Aeson inspired his son Jason.

Version Compatibility

Note that we're aggressive about pushing

forward along with new versions of Swift. Therefore, we highly recommend against pointing at
, and instead using one of the releases we've provided.

Here is the current Swift compatibility breakdown:

| Swift Version | Argo Version | | ------------- | ------------ | | 4.X | master | | 3.X | 4.X | | 2.2, 2.3 | 3.X | | 2.0, 2.1 | 2.X | | 1.2 - 2.0 | 1.X | | 1.1 | 0.3.X |



Add the following to your Cartfile:

github "thoughtbot/Argo"

Then run

carthage update

Follow the current instructions in Carthage's README for up to date installation instructions.

Note that if you are using newer versions of Argo, you will need to link both

into your app.


Add the following to your Podfile:

pod 'Argo'

You will also need to make sure you're opting into using frameworks:


Then run

pod install
with CocoaPods 0.36 or newer.

Git Submodules

I guess you could do it this way if that's your thing.

Add this repo as a submodule, and add the project file to your workspace. You can then link against

for your application target.

You will need to do the same for Runes if you are using newer versions of Argo.

Usage tl;dr:

Please note: the example below requires an additional, external module named Curry which lets us use the

function to curry

It also imports Runes, which is a dependency of Argo in newer versions. If you are using an older version of Argo, you might not need that import.

import Argo
import Curry
import Runes

struct User { let id: Int let name: String let email: String? let role: Role let companyName: String let friends: [User] }

extension User: Decodable { static func decode(_ json: JSON) -> Decoded { return curry(User.init) json json json json json json

For more information, see the Documentation


See the CONTRIBUTING document. Thank you, contributors!


Argo is Copyright (c) 2015 thoughtbot, inc. It is free software, and may be redistributed under the terms specified in the LICENSE file.



Argo is maintained and funded by thoughtbot, inc. The names and logos for thoughtbot are trademarks of thoughtbot, inc.

We love open source software! See our other projects or look at our product case studies and hire us to help build your iOS app.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.