A JSON deserialization library for Swift

Related tags

JSON lyft
Overview

Mapper

Mapper is a simple Swift library to convert JSON to strongly typed objects. One advantage to Mapper over some other libraries is you can have immutable properties.

Installation

With CocoaPods

use_frameworks!

pod "ModelMapper"

With Carthage

github "lyft/mapper"

Usage

Simple example:

import Mapper
// Conform to the Mappable protocol
struct User: Mappable {
  let id: String
  let photoURL: URL?

  // Implement this initializer
  init(map: Mapper) throws {
    try id = map.from("id")
    photoURL = map.optionalFrom("avatar_url")
  }
}

// Create a user!
let JSON: NSDictionary = ...
let user = User.from(JSON) // This is a 'User?'

Using with enums:

enum UserType: String {
  case Normal = "normal"
  case Admin = "admin"
}

struct User: Mappable {
  let id: String
  let type: UserType

  init(map: Mapper) throws {
    try id = map.from("id")
    try type = map.from("user_type")
  }
}

Nested Mappable objects:

struct User: Mappable {
  let id: String
  let name: String

  init(map: Mapper) throws {
    try id = map.from("id")
    try name = map.from("name")
  }
}

struct Group: Mappable {
  let id: String
  let users: [User]

  init(map: Mapper) throws {
    try id = map.from("id")
    users = map.optionalFrom("users") ?? []
  }
}

Use Convertible to transparently convert other types from JSON:

extension CLLocationCoordinate2D: Convertible {
  public static func fromMap(_ value: Any) throws -> CLLocationCoordinate2D {
    guard let location = value as? NSDictionary,
      let latitude = location["lat"] as? Double,
      let longitude = location["lng"] as? Double else
      {
         throw MapperError.convertibleError(value: value, type: [String: Double].self)
      }

      return CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
  }
}

struct Place: Mappable {
  let name: String
  let location: CLLocationCoordinate2D

  init(map: Mapper) throws {
    try name = map.from("name")
    try location = map.from("location")
  }
}

let JSON: NSDictionary = [
  "name": "Lyft HQ",
  "location": [
    "lat": 37.7603392,
    "lng": -122.41267249999999,
  ],
]

let place = Place.from(JSON)

Custom Transformations

private func extractFirstName(object: Any?) throws -> String {
  guard let fullName = object as? String else {
    throw MapperError.convertibleError(value: object, type: String.self)
  }

  let parts = fullName.characters.split { $0 == " " }.map(String.init)
  if let firstName = parts.first {
    return firstName
  }

  throw MapperError.customError(field: nil, message: "Couldn't split the string!")
}

struct User: Mappable {
  let firstName: String

  init(map: Mapper) throws {
    try firstName = map.from("name", transformation: extractFirstName)
  }
}

Parse nested or entire objects

struct User: Mappable {
  let name: String
  let JSON: AnyObject

  init(map: Mapper) throws {
    // Access the 'first' key nested in a 'name' dictionary
    try 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.

Open Radars

These radars have affected the current implementation of Mapper

  • rdar://23376350 Protocol extensions with initializers do not work in extensions
  • rdar://23358609 Protocol extensions with initializers do not play well with classes
  • rdar://23226135 Can't conform to protocols with similar generic function signatures
  • rdar://23147654 Generic functions are not differentiated by their ability to throw
  • rdar://23695200 Using the ?? operator many times is unsustainable.
  • rdar://23697280 Lazy collection elements can be evaluated multiple times.
  • rdar://23718307 Non final class with protocol extensions returning Self don't work

License

Mapper is maintained by Lyft and released under the Apache 2.0 license. See LICENSE for details

Comments
  • Map from RawRepresentable Enum arrays

    Map from RawRepresentable Enum arrays

    Allow mapping from arrays of enums. For example:

    enum Value: String {
      case A = "a"
      case B = "b"
      case C = "c"
    }
    
    let json: NSDictionary = ["values": ["a", "b", "c", "a"]]
    let map = Mapper(JSON: json)
    
    let values: [Value] = map.from("values")
    
    
    opened by litso 15
  • Any way to know which key failed in JSON deserialization?

    Any way to know which key failed in JSON deserialization?

    Hi there!

    I am really loving Mapper, it allows the decoupled structure I've wanted from a JSON parser, but haven't been able to find elsewhere.

    I've setup a relatively complicated set of models, where 1 model is dependent on 4 or 5 other models, and those models have their own dependencies inside as well. A simple version of these models may look something like this:

    Feed (Consists of): -- Header ---- title ---- subtitle ---- date

    -- Footer ---- Image ------ URL ---- title ---- subtitle

    When parsing the main model (Feed), at some point, one of those parsings fails (either in Header, Footer, or Image), and I'm having a difficult time figuring out which one is the one ultimately causing the JSON parsing to throw.

    I've read through the readme a few times, read through the issues, and gone through the source code but still haven't been able to figure out if there's an easy way, other than commenting out all the models that don't work, and adding them back in one by one, to figure out which model is causing the parser to throw?

    If there's any other information that may be helpful, please let me know. Thanks a lot!

    opened by mergesort 12
  • Handling of null values mapped to optional URL property

    Handling of null values mapped to optional URL property

    I'm mapping this JSON object:

    {
          "id": 19627,
          "name": "Viktor Bestayev",
          "credits": "Cinematography",
          "image_url": null
    }
    

    to this model

    struct Cast: Mappable {
        let castId: Int
        let name: String
        let credits: String
        let imageURL: URL?
        
        init(map: Mapper) throws {
            try castId = map.from("id")
            try name = map.from("name")
            try credits = map.from("credits")
            imageURL = map.optionalFrom("image_url")
        }
    }
    

    And this throws an MapperError.convertibleError because of the image_url null value. What is the intended way of handling this case?

    opened by jpstuehler 11
  • Map Dictionary to [Self]?

    Map Dictionary to [Self]?

    I was discussing with @sberrevoets elsewhere, and other JSON libraries have functionality that allows you to return an array of Mappables, rather than just one.

    I have a convert function, using a generic that takes vends a T, but I can’t make it take in [T], because [T] is not Mappable, even though T technically is. This would be useful because instead of having to create an intermediate object (like TList) around your Mappable type with one field ([T]), you'd be able to just vend a [T] from the JSON response.

    Currently these two functions exist.

    static func from(_ JSON: NSDictionary) -> Self?
    
    static func from(_ JSON: NSArray) -> [Self]?
    

    And I'd propose a third to one be added.

    static func from(_ JSON: NSDictionary) -> [Self]?
    

    Thanks a lot! Happy to add on any more information to help.

    opened by mergesort 9
  • Fix transformation nullability

    Fix transformation nullability

    Noticed this when I was upgrading to 3.0.0 recently, It makes consumers have either force unwrap the transformation argument or guard it and do the same code that JSONFromField(field) does, which isn't nice.

    opened by Noobish1 9
  • Doubly nested arrays

    Doubly nested arrays

    Hi, been waiting to use mapper for a personal project for quite a while now and finally came around to doing so. Really loving it!

    The only problem is that the API I'm working with is sending data as a doubly-nested array at one point. And I'm not quite sure how to work with this 😕

    I've defined my model struct like this:

    struct Building {
        // ...
        let points: [[CLLocationCoordinate2D]]
    }
    

    Deserializing like this unfortunately isn't working:

    extension Building: Mappable {
        init(map: Mapper) throws {
            // ...
            try points = map.from("punkte")
        }
    }
    

    Is there a simple way to get around this? Should this be working and I'm missing something else?

    Thanks for any help in advance 😊

    opened by kiliankoe 9
  • Carthage fails to build Mapper for watchOS

    Carthage fails to build Mapper for watchOS

    This line carthage update --platform watchos Gives such output:

    *** Fetching mapper
    *** Checking out mapper at "1.0.1"
    *** xcodebuild output can be found in /var/folders/f_/t413twvd70969xm53wbmq4j00000gn/T/carthage-xcodebuild.beMwhr.log
    *** Skipped building mapper due to the error:
    Dependency "mapper" has no shared framework schemes for any of the platforms: watchOS
    
    If you believe this to be an error, please file an issue with the maintainers at https://github.com/Lyft/mapper/issues/new
    

    Adding --no-skip-current and/or removing --platform watchOS doesn't help

    I'll try to check what's happening.

    opened by Austinate 9
  • WIP: Add creation of a non-optional array from NSArray

    WIP: Add creation of a non-optional array from NSArray

    The goal is to have two versions of .from(JSON: NSArray) — one that returns nil if any of the objects throw, and one that simply discards objects that throw, but always returns an array that contains the objects that could be created.

    I've come across a strange issue in the tests though, specifically testCreatingFromInvalidArray and testCreatingFromPartiallyInvalidArrayOfJSON. The .from calls seem to prefer the non-optional version that returns an array, instead of the optional version which returns nil if any object creation fails. If you command-click on .from in Xcode, it also leads you to the non-optional version.

    Sorry if my explanation is confusing, let me know if you need any clarification!

    opened by kylebshr 8
  • More descriptive MapperError

    More descriptive MapperError

    Understand that my implementation of Mappable init can throw any error I want, but was just seeing how receptive you would be to change along the following lines:

    Would be nice to have an indication of which field caused the throw, possibly also an indication of why it was thrown. This would be a good way to get slightly more descriptive errors without having to implement custom throws from each call to mapper.from.

    This change would potentially involve adding an associated message value to MapperError, something along the lines of:

    public struct MapperError: ErrorType {
        case MapError(string)
        @warn_unused_result
        public init(message: String) {
           self = .MapError(message)
       }
    }
    
    opened by litso 8
  • Get feedback on failed parsing

    Get feedback on failed parsing

    I have a feature request, and I took a look at how to implement it and am struggling to find an idea:

    • I want to know when something goes wrong parsing, even if it was able to create a model (and I want the model also). Currently, if an optional field fails, it fails completely silently.

    Ideas:

    The easiest way to do it as far as I can see is add some sort of failure closure to the Mapper object which is called whenever a failure occurs.

    A better way would be to throw an error, but include the actual model as part of that error. I don't think this is possible in swift though? Is it possible to include self in the object which you throw? Maybe you could do a convenience init which calls the other init first, then checks if there was an error, then throws a new error? Not sure if that works though...

    Anyway, the real question is: is this a feature you think fits in with Mapper? It should definitely be opt in so backwards compatible, but interested in your thoughts.

    opened by plivesey 7
  • Mark App extension safe API only

    Mark App extension safe API only

    It looks like this isn't using anything that's not extension safe, but it's not marked as safe. Could we get it marked as safe so I can get rid of this warning? :)

    opened by dmauro 7
  • Bump tzinfo from 1.2.5 to 1.2.10

    Bump tzinfo from 1.2.5 to 1.2.10

    Bumps tzinfo from 1.2.5 to 1.2.10.

    Release notes

    Sourced from tzinfo's releases.

    v1.2.10

    TZInfo v1.2.10 on RubyGems.org

    v1.2.9

    • Fixed an incorrect InvalidTimezoneIdentifier exception raised when loading a zoneinfo file that includes rules specifying an additional transition to the final defined offset (for example, Africa/Casablanca in version 2018e of the Time Zone Database). #123.

    TZInfo v1.2.9 on RubyGems.org

    v1.2.8

    • Added support for handling "slim" format zoneinfo files that are produced by default by zic version 2020b and later. The POSIX-style TZ string is now used calculate DST transition times after the final defined transition in the file. The 64-bit section is now always used regardless of whether Time has support for 64-bit times. #120.
    • Rubinius is no longer supported.

    TZInfo v1.2.8 on RubyGems.org

    v1.2.7

    • Fixed 'wrong number of arguments' errors when running on JRuby 9.0. #114.
    • Fixed warnings when running on Ruby 2.8. #112.

    TZInfo v1.2.7 on RubyGems.org

    v1.2.6

    • Timezone#strftime('%s', time) will now return the correct number of seconds since the epoch. #91.
    • Removed the unused TZInfo::RubyDataSource::REQUIRE_PATH constant.
    • Fixed "SecurityError: Insecure operation - require" exceptions when loading data with recent Ruby releases in safe mode.
    • Fixed warnings when running on Ruby 2.7. #106 and #111.

    TZInfo v1.2.6 on RubyGems.org

    Changelog

    Sourced from tzinfo's changelog.

    Version 1.2.10 - 19-Jul-2022

    Version 1.2.9 - 16-Dec-2020

    • Fixed an incorrect InvalidTimezoneIdentifier exception raised when loading a zoneinfo file that includes rules specifying an additional transition to the final defined offset (for example, Africa/Casablanca in version 2018e of the Time Zone Database). #123.

    Version 1.2.8 - 8-Nov-2020

    • Added support for handling "slim" format zoneinfo files that are produced by default by zic version 2020b and later. The POSIX-style TZ string is now used calculate DST transition times after the final defined transition in the file. The 64-bit section is now always used regardless of whether Time has support for 64-bit times. #120.
    • Rubinius is no longer supported.

    Version 1.2.7 - 2-Apr-2020

    • Fixed 'wrong number of arguments' errors when running on JRuby 9.0. #114.
    • Fixed warnings when running on Ruby 2.8. #112.

    Version 1.2.6 - 24-Dec-2019

    • Timezone#strftime('%s', time) will now return the correct number of seconds since the epoch. #91.
    • Removed the unused TZInfo::RubyDataSource::REQUIRE_PATH constant.
    • Fixed "SecurityError: Insecure operation - require" exceptions when loading data with recent Ruby releases in safe mode.
    • Fixed warnings when running on Ruby 2.7. #106 and #111.
    Commits
    • 0814dcd Fix the release date.
    • fd05e2a Preparing v1.2.10.
    • b98c32e Merge branch 'fix-directory-traversal-1.2' into 1.2
    • ac3ee68 Remove unnecessary escaping of + within regex character classes.
    • 9d49bf9 Fix relative path loading tests.
    • 394c381 Remove private_constant for consistency and compatibility.
    • 5e9f990 Exclude Arch Linux's SECURITY file from the time zone index.
    • 17fc9e1 Workaround for 'Permission denied - NUL' errors with JRuby on Windows.
    • 6bd7a51 Update copyright years.
    • 9905ca9 Fix directory traversal in Timezone.get when using Ruby data source
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump cocoapods-downloader from 1.2.2 to 1.6.3

    Bump cocoapods-downloader from 1.2.2 to 1.6.3

    Bumps cocoapods-downloader from 1.2.2 to 1.6.3.

    Release notes

    Sourced from cocoapods-downloader's releases.

    1.6.3

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.2

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.1

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.0

    Enhancements
    • None.
    Bug Fixes
    • Adds a check for command injections in the input for hg and git.
      orta #124

    1.5.1

    Enhancements
    • None.
    Bug Fixes
    • Fix "can't modify frozen string" errors when pods are integrated using the branch option
      buju77 #10920

    1.5.0

    ... (truncated)

    Changelog

    Sourced from cocoapods-downloader's changelog.

    1.6.3 (2022-04-01)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.2 (2022-03-28)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.1 (2022-03-23)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.0 (2022-03-22)

    Enhancements
    • None.
    Bug Fixes
    • Adds a check for command injections in the input for hg and git.
      orta #124

    1.5.1 (2021-09-07)

    Enhancements
    • None.

    ... (truncated)

    Commits
    • c03e2ed Release 1.6.3
    • f75bccc Disable Bazaar tests due to macOS 12.3 not including python2
    • 52a0d54 Merge pull request #128 from CocoaPods/validate_before_dl
    • d27c983 Ensure that the git pre-processor doesn't accidentally bail also
    • 3adfe1f [CHANGELOG] Add empty Master section
    • 591167a Release 1.6.2
    • d2564c3 Merge pull request #127 from CocoaPods/validate_before_dl
    • 99fec61 Switches where we check for invalid input, to move it inside the download fun...
    • 96679f2 [CHANGELOG] Add empty Master section
    • 3a7c54b Release 1.6.1
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Cannot build for iOS Simulator on Apple Silicon

    Cannot build for iOS Simulator on Apple Silicon

    I think the issue stems from this line. Someone else has come to the same conclusion.

    The builds produced cannot be run on the iOS Simulator on Apple Silicon, failing with the error:

    Could not find module 'Mapper' for target 'arm64-apple-ios-simulator'; found: x86_64-apple-ios-simulator, i386-apple-ios-simulator, at: /Users/…/Library/Developer/Xcode/DerivedData/…/Build/Products/Debug-iphonesimulator/Mapper.framework/Modules/Mapper.swiftmodule

    opened by Drarok 0
  • Change NSArray and NSDictionary to use Swift literal dictionary and array

    Change NSArray and NSDictionary to use Swift literal dictionary and array

    Hey guys, I'd like to contribute with this changes in NSDictionary and NSArray to use Swift literal dictionary and array. @keith can you take a look at this, please?

    Issue #80

    opened by thejohnlima 2
  • How to handle keys with

    How to handle keys with "."

    I am trying to map a dictonary where the keys have ".", for example "gcm.message_id": 2002

    How can I use the Mapper to not see those "." as a path?

    opened by walsht 3
Owner
Lyft
Lyft
Swift-json - High-performance json parsing in swift

json 0.1.4 swift-json is a pure-Swift JSON parsing library designed for high-per

kelvin 43 Dec 15, 2022
JSON-Practice - JSON Practice With Swift

JSON Practice Vista creada con: Programmatic + AutoLayout Breve explicación de l

Vanesa Giselle Korbenfeld 0 Oct 29, 2021
Ss-json - High-performance json parsing in swift

json 0.1.1 swift-json is a pure-Swift JSON parsing library designed for high-per

kelvin 43 Dec 15, 2022
Swift parser for JSON Feed — a new format similar to RSS and Atom but in JSON.

JSONFeed Swift parser for JSON Feed — a new format similar to RSS and Atom but in JSON. For more information about this new feed format visit: https:/

Toto Tvalavadze 31 Nov 22, 2021
JSONNeverDie - Auto reflection tool from JSON to Model, user friendly JSON encoder / decoder, aims to never die

JSONNeverDie is an auto reflection tool from JSON to Model, a user friendly JSON encoder / decoder, aims to never die. Also JSONNeverDie is a very important part of Pitaya.

John Lui 454 Oct 30, 2022
[Deprecated] A shiny JSON parsing library in Swift :sparkles: Loved by many from 2015-2021

?? Deprecation Notice ?? Gloss has been deprecated in favor of Swift's Codable framework. The existing Gloss source is not going away, however updates

Harlan Kellaway 1.6k Nov 24, 2022
Himotoki (紐解き) is a type-safe JSON decoding library written purely in Swift.

Himotoki Himotoki (紐解き) is a type-safe JSON decoding library written purely in Swift. This library is highly inspired by the popular Swift JSON parsin

IKEDA Sho 799 Dec 6, 2022
Swift library for JSON-RPC

JSONRPC There are already a bunch of packages out there for doing JSON-RPC in Swift. This one is just very simple and makes no assumptions about the t

Chime 16 Dec 30, 2022
A type-safe JSON-RPC 2.0 library purely written in Swift

JSONRPCKit JSONRPCKit is a type-safe JSON-RPC 2.0 library purely written in Swift. // Generating request JSON let batchFactory = BatchFactory(version:

Shinichiro Oba 178 Mar 18, 2022
Developed with use Swift language. As a third party library used SDWebImage. JSON parsing using URLSession with TMDB API. This app provide by the Core Data structure.

Capstone Project ?? About Developed with use Swift language. As a third party library used SDWebImage. JSON parsing using URLSession with TMDB API. Ad

Ensar Batuhan Unverdi 9 Aug 22, 2022
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

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

thoughtbot, inc. 3.5k Dec 20, 2022
Library of Swiftui Views conforming to Codable, meaning we can produce JSON driven UI!

CodableView Library of Swiftui Views conforming to Codable, meaning we can produce JSON driven UI! Adding a CodableView Type Create View that conforms

Daniel Bolella 3 Apr 2, 2022
🧱 A JSON decoding/encoding library that handles optimistically or strictly.

Do you need to handle the root cause of failure in decoding JSON? We often process the value as a default value if it could not be decoded from JSON.

Muukii 252 Oct 28, 2022
Codable code is a Swift Package that allows you to convert JSON Strings into Swift structs

Codable code is a Swift Package that allows you to convert JSON Strings into Swift structs.

Julio Cesar Guzman Villanueva 2 Oct 6, 2022
Implement dynamic JSON decoding within the constraints of Swift's sound type system by working on top of Swift's Codable implementations.

DynamicCodableKit DynamicCodableKit helps you to implement dynamic JSON decoding within the constraints of Swift's sound type system by working on top

SwiftyLab 15 Oct 16, 2022
AlamofireObjectMappe - An Alamofire extension which converts JSON response data into swift objects using ObjectMapper

AlamofireObjectMapper An extension to Alamofire which automatically converts JSON response data into swift objects using ObjectMapper. Usage Given a U

Tristan Himmelman 2.6k Dec 29, 2022
Elevate is a JSON parsing framework that leverages Swift to make parsing simple, reliable and composable

Elevate is a JSON parsing framework that leverages Swift to make parsing simple, reliable and composable. Elevate should no longer be used for

Nike Inc. 611 Oct 23, 2022
Freddy - A reusable framework for parsing JSON in Swift.

Why Freddy? Parsing JSON elegantly and safely can be hard, but Freddy is here to help. Freddy is a reusable framework for parsing JSON in Swift. It ha

Big Nerd Ranch 1.1k Jan 1, 2023
HandyJSON is a framework written in Swift which to make converting model objects to and from JSON easy on iOS.

HandyJSON To deal with crash on iOS 14 beta4 please try version 5.0.3-beta HandyJSON is a framework written in Swift which to make converting model ob

Alibaba 4.1k Dec 29, 2022