A sweet and swifty YAML parser built on LibYAML.

Overview

Yams

Yams

A sweet and swifty YAML parser built on LibYAML.

SwiftPM xcodebuild pod lib lint Nightly codecov

Installation

Building Yams requires Xcode 11.x or a Swift 5.1+ toolchain with the Swift Package Manager or CMake and Ninja.

CMake

CMake 3.17.2 or newer is required, along with Ninja 1.9.0 or newer.

When building for non-Apple platforms:

cmake -B /path/to/build -G Ninja -S /path/to/yams -DCMAKE_BUILD_TYPE=Release -DFoundation_DIR=/path/to/foundation/build/cmake/modules
cmake --build /path/to/build

To build for Apple platforms (macOS, iOS, tvOS, watchOS), there is no need to spearately build Foundation because it is included as part of the SDK:

cmake -B /path/to/build -G Ninja -S /path/to/yams -DCMAKE_BUILD_TYPE=Release
cmake --build /path/to/build

Swift Package Manager

Add .package(url: "https://github.com/jpsim/Yams.git", from: "4.0.6") to your Package.swift file's dependencies.

CocoaPods

Add pod 'Yams' to your Podfile.

Carthage

Add github "jpsim/Yams" to your Cartfile.

Bazel

In your WORKSPACE file

YAMS_GIT_SHA = "SOME_SHA"
http_archive(
    name = "com_github_jpsim_yams",
    urls = [
        "https://github.com/jpsim/Yams/archive/%s.zip" % YAMS_GIT_SHA,
    ],
    strip_prefix = "yams-%s" % YAMS_GIT_SHA,
)

Usage

Yams has three groups of conversion APIs: one for use with Codable types, another for Swift Standard Library types, and a third one for a Yams-native representation.

Codable types

  • Codable is an encoding & decoding strategy introduced in Swift 4 enabling easy conversion between YAML and other Encoders like JSONEncoder and PropertyListEncoder.
  • Lowest computational overhead, equivalent to Yams.Node.
  • Encoding: YAMLEncoder.encode(_:) Produces a YAML String from an instance of type conforming to Encodable.
  • Decoding: YAMLDecoder.decode(_:from:) Decodes an instance of type conforming to Decodable from YAML String or Data.
import Foundation
import Yams

struct S: Codable {
    var p: String
}

let s = S(p: "test")
let encoder = YAMLEncoder()
let encodedYAML = try encoder.encode(s)
encodedYAML == """
p: test

"""
let decoder = YAMLDecoder()
let decoded = try decoder.decode(S.self, from: encodedYAML)
s.p == decoded.p

Swift Standard Library types

  • The type of Swift Standard Library is inferred from the contents of the internal Yams.Node representation by matching regular expressions.
  • This method has the largest computational overhead When decoding YAML, because the type inference of all objects is done up-front.
  • It may be easier to use in such a way as to handle objects created from JSONSerialization or if the input is already standard library types (Any, Dictionary, Array, etc.).
  • Encoding: Yams.dump(object:) Produces a YAML String from an instance of Swift Standard Library types.
  • Decoding: Yams.load(yaml:) Produces an instance of Swift Standard Library types as Any from YAML String.
// [String: Any]
let dictionary: [String: Any] = ["key": "value"]
let mapYAML: String = try Yams.dump(object: dictionary)
mapYAML == """
key: value

"""
let loadedDictionary = try Yams.load(yaml: mapYAML) as? [String: Any]

// [Any]
let array: [Int] = [1, 2, 3]
let sequenceYAML: String = try Yams.dump(object: array)
sequenceYAML == """
- 1
- 2
- 3

"""
let loadedArray: [Int]? = try Yams.load(yaml: sequenceYAML) as? [Int]

// Any
let string = "string"
let scalarYAML: String = try Yams.dump(object: string)
scalarYAML == """
string

"""
let loadedString: String? = try Yams.load(yaml: scalarYAML) as? String

Yams.Node

  • Yams' native model representing Nodes of YAML which provides all functions such as detection and customization of the YAML format.
  • Depending on how it is used, computational overhead can be minimized.
  • Encoding: Yams.serialize(node:) Produces a YAML String from an instance of Node.
  • Decoding Yams.compose(yaml:) Produces an instance of Node from YAML String.
var map: Yams.Node = [
    "array": [
        1, 2, 3
    ]
]
map.mapping?.style = .flow
map["array"]?.sequence?.style = .flow
let yaml = try Yams.serialize(node: map)
yaml == """
{array: [1, 2, 3]}

"""
let node = try Yams.compose(yaml: yaml)
map == node

Integrating with Combine

When Apple's Combine framework is available, YAMLDecoder conforms to the TopLevelDecoder protocol, which allows it to be used with the decode(type:decoder:) operator:

import Combine
import Foundation
import Yams

func fetchBook(from url: URL) -> AnyPublisherError> {
    URLSession.shared.dataTaskPublisher(for: url)
        .map(\.data)
        .decode(type: Book.self, decoder: YAMLDecoder())
        .eraseToAnyPublisher()
}

License

Both Yams and libYAML are MIT licensed.

Comments
  • [Experimental] Replace FloatingPoint Formatter and add support Float80

    [Experimental] Replace FloatingPoint Formatter and add support Float80

    • Use SwiftDtoa.(h|cpp) for formatting FloatingPoint into String
    • Support Float80 as ScalarConstructible and ScalarRepresentable

    ~~On Linux,~~ Supporting Float80 requires Swift 4.2+, since swift_decompose_float80() does not exists on Swift 4.1 or earlier. Is this a good opportunity to drop supporting Swift 4.0/4.1?

    opened by norio-nomura 16
  • build: add CMake based build

    build: add CMake based build

    This adds a CMake (3.15.1) based build to enable building Yams on platforms where s-p-m does not yet function. It also enables cross-compilation of Yams. This is sufficient to be able to build for Windows with the following command line:

    cmake -H build\debug -G Ninja -DFoundation_DIR=... -DCMAKE_Swift_COMPILER=...
    cmake --build build\debug
    
    opened by compnerd 15
  • Special FP names are inconsistent

    Special FP names are inconsistent

    On Windows, I am seeing -.infe+0, .infe+0, and nane+0 instead of -.inf, .inf, and nan. I cannot identify where the conversion from the value to the name is occuring.

    A second type of incompatibility occurs with the spec test with NaN being used instead of nan. AIUI, NaN and nan are interchangable as per the C standard, and that should be accepted as equivalent unless the string representation is being constructed explicitly in the Swift side of the code.

    opened by compnerd 13
  • Yams: make `CYaml` private to Yams

    Yams: make `CYaml` private to Yams

    This changes how CYaml is built and used within Yams. As there are no interfaces from CYaml being directly exposed, we can statically link the library. However, this still would cause a problem as the CYaml import would be serialized into the module requiring that the module is available when building anything which consumes Yams. To avoid that, change the import CYaml instances to @_implementationOnly. This allows for CYaml to not be required at the consumer site.

    While in the area of the CMake build system, clean up some of the build system to use language specific options. This is required to avoid the de-duplication of the options across languages and enables linking CYaml statically into the library. Note that on Windows static linking of Swift libraries is not yet properly supported and this does not enable that nor use that - it is statically linking C content.

    This now allows building Yams dynamically as a single library target. On Windows, this is a negligible space savings of ~16KiB.

    opened by compnerd 11
  • Xcode error:

    Xcode error: "Missing required module 'CYaml'"

    I added Yams as a dependency to a Swift library following the installation instructions for Swift Package Manager that are provided in the README:

    Add .package(url: "https://github.com/jpsim/Yams.git", from: "2.0.0") to your Package.swift file's dependencies.

    Everything worked when I ran unit tests for that library. However, when I tried to add my library as a dependency in a separate project, my (generated) Xcode project for the package became unable to compile, generating the error:

    Xcode error: "Missing required module 'CYaml'"

    I thought this might be related to #236, and tried pointing the original package to master, but that didn't change anything. (On a separate note, it would be nice to have the latest changes on master available in a tagged release).

    opened by mattt 10
  • Fix build with tensorflow toolchain

    Fix build with tensorflow toolchain

    Due to https://bugs.swift.org/browse/TF-1203, there's a build failure without this patch:

    error: static member 'pow' cannot be used on instance of type 'Double'
    

    I believe this was the intent of 70140a180ae63292c5189815d35480269087c306, but it didn't seem to actually fix it.

    opened by garymm 8
  • Allow decode from data

    Allow decode from data

    I couldn't find a mention of the word data in Readme.md and just wondering if there's a significant reason that decodeFrom is only available with string not data?

    opened by mitchins 8
  • Support SE-0166 Swift Archival & Serialization

    Support SE-0166 Swift Archival & Serialization

    Support SE-0166 Swift Archival & Serialization Fixes #38

    ~This uses local built toolchain https://github.com/norio-nomura/swift-dev/releases/tag/20170501a~

    TODOs for merging:

    • ~~[ ] Add text encoding detection to YAMLDecoder.decode(_:from:)~~
    • [x] Revise throwing errors on failing Encode and Decode
    • [x] Add more tests
    • [x] Support first snapshot of Swift 4.0
    opened by norio-nomura 8
  • Improve `Node` with adding typed accessors

    Improve `Node` with adding typed accessors

    This PR based on #11 and against to master.

    Focusing to utilize Yams.compose*() by using typed accessor that enables to access without resolving Node to Any.

    Add typed accessor properties to Node:

    • string
    • bool
    • float
    • null
    • int
    • binary
    • timestamp

    Convenient accessor method to Node.sequence:

    • array() returns [Node]
    • array<Type: ScalarConstructible>() returns [Type]
    • array<Type: ScalarConstructible>(of type: Type.Type) returns [Type]
    let sequence: Node = [
        "true",
        "1.0",
        "1",
        .scalar(base64String, .implicit)
    ]
    XCTAssertEqual(sequence.array(), ["true", "1.0", "1", .scalar(base64String, .implicit)] as [Node])
    XCTAssertEqual(sequence.array(of: String.self), ["true", "1.0", "1", base64String])
    XCTAssertEqual(sequence.array() as [String], ["true", "1.0", "1", base64String])
    XCTAssertEqual(sequence.array(of: Bool.self), [true])
    XCTAssertEqual(sequence.array() as [Bool], [true])
    XCTAssertEqual(sequence.array(of: Double.self), [1.0, 1.0])
    XCTAssertEqual(sequence.array() as [Double], [1.0, 1.0])
    XCTAssertEqual(sequence.array(of: Int.self), [1])
    XCTAssertEqual(sequence.array() as [Int], [1])
    

    Add subscript to Node.mapping:

    guard let yaml = try Yams.compose(yaml: yamlString),
        let moduleCommand = yaml["commands"]?["<SourceKittenFramework.module>"],
        let imports = moduleCommand["import-paths"]?.array(of: String.self),
        let otherArguments = moduleCommand["other-args"]?.array(of: String.self),
        let sources = moduleCommand["sources"]?.array(of: String.self) else {
            XCTFail("Invalid result form Yams.load()")
            return
    }
    XCTAssertEqual(imports, self.expectedImports)
    XCTAssertEqual(otherArguments, self.expectedOtherArguments)
    XCTAssertEqual(sources, self.expectedSources)
    

    Using typed accessors is faster than [String:Any] operations because converting operations are minimized.

    • [String:Any] operations

    Test Case 'PerformanceTests.testSourceKittenIssue289Load' measured [Time, seconds] average: 0.041, relative standard deviation: 11.743%, values: [0.052250, 0.045143, 0.037565, 0.041266, 0.037317, 0.038670, 0.037988, 0.038400, 0.038109, 0.038300], performanceMetricID:org.swift.XCTPerformanceMetric_WallClockTime, maxPercentRelativeStandardDeviation: 10.000%, maxStandardDeviation: 0.100

    • Typed accessor operations:

    Test Case 'PerformanceTests.testSourceKittenIssue289Compose' measured [Time, seconds] average: 0.013, relative standard deviation: 25.008%, values: [0.010489, 0.010995, 0.009678, 0.017652, 0.017646, 0.010401, 0.012421, 0.012176, 0.009676, 0.015881], performanceMetricID:org.swift.XCTPerformanceMetric_WallClockTime, maxPercentRelativeStandardDeviation: 10.000%, maxStandardDeviation: 0.100

    Some features are not supported on typed accessor properties:

    !!merge and !!value are not supported on using typed accessor properties, because those are handled in constructing dictionary from Node.mapping.

    Happy Holidays!

    opened by norio-nomura 7
  • Change to use `yaml_parser_parse()` instead of `yaml_parser_load()`

    Change to use `yaml_parser_parse()` instead of `yaml_parser_load()`

    This does:

    • Add Parser class that representing of yaml_parser_t
    • Add Tag ~enum~ class
    • Change Node
      • Add Tag to each case’s associated value
      • ~Change .mapping to holding [Node:Node]~
      • Remove init(string:)
      • Add array property that returns [Node]?
      • Add dictionary property that returns [Node:Node]?
      • Add string property that returns String?

    TODOs on this PR:

    • [x] Add Resolver that resolve scalar into Swift Types. Fixes #6, #7 and part of #8.
    • [x] Add more test cases
    • [x] Add Performance tests

    This PR rewrites almost all the codes. Is it better to publish in my own repository instead of PR against Yams?

    opened by norio-nomura 7
  • Yams is not compatible with Swift REPL

    Yams is not compatible with Swift REPL

    I am using Yams as a dependency for my swift package library. Yams is included as a swift package in a standard way. I use the command swift run --repl for running my library in REPL mode. This command runs the Swift interpreter with these arguments:

    Launching Swift REPL with arguments: -I/Users/dan/Documents/Development/Projects/Toolkit/.build/x86_64-apple-macosx/debug -L/Users/dan/Documents/Development/Projects/Toolkit/.build/x86_64-apple-macosx/debug -lToolkit__REPL -I/Users/dan/Documents/Development/Projects/Toolkit/.build/checkouts/Yams/Sources/CYaml/include
    

    Swift REPL session is started but unfortunately, the session in Swift REPL is often interrupted with error messages like (not only once but quite often)

    warning: (x86_64) /Users/dan/Documents/Development/Projects/Toolkit/.build/x86_64-apple-macosx/debug/libToolkit__REPL.dylib unable to load swift module "Yams" (failed to get module "Toolkit" from AST context:
    error: missing required module 'CYaml'
    )
    

    Besides these annoying errors, it looks like Yams somehow works. It mostly gives good results. I tried also different Yaml libraries for Swift, but as far as I know, only Yams supports Swift Codable.

    When I am using Yams in Swift script, it often works. But sometimes it returns zsh: segmentation fault error. But usage with Swift REPL is still problematic. I would be more than happy if there is some solution. Using Yams with REPL is very useful. I know that problem with CYaml was already discussed in a different context. Do you have some tips on how to fix this, please? Thank you.

    This is my Package.swift. It defines one library and two executables.

    // swift-tools-version:5.2
    // The swift-tools-version declares the minimum version of Swift required to build this package.
    
    import PackageDescription
    
    let package = Package(
        name: "Toolkit",
        platforms: [
            .macOS(.v10_15)
        ],
        products: [
            .executable(name: "ToolkitTester", targets: ["ToolkitTester"]),
            .executable(name: "Timer", targets: ["Timer"]),
            .library(name: "Toolkit", targets: ["Toolkit"])
        ],
        dependencies: [
            .package(url: "https://github.com/JohnSundell/Files.git", .branch("master")),
            .package(url: "https://github.com/kareman/SwiftShell.git", .branch("master")),
            .package(url: "https://github.com/DanielCech/Moderator.git", .branch("master")),
            .package(url: "https://github.com/stencilproject/Stencil.git", from: "0.13.0"),
            .package(url: "https://github.com/SwiftGen/StencilSwiftKit.git", from: "2.7.2"),
            .package(url: "https://github.com/onevcat/Rainbow.git", from: "4.0.0"),
            // .package(name: "Yaml", url: "https://github.com/behrang/YamlSwift.git", .branch("master")),
            .package(url: "https://github.com/jpsim/Yams.git", from: "4.0.6")
        ],
        targets: [
            // Targets are the basic building blocks of a package. A target can define a module or a test suite.
            // Targets can depend on other targets in this package, and on products in packages which this package depends on.
            .target(
                name: "Toolkit",
                dependencies: ["Files", "Moderator", "SwiftShell", "Stencil", "StencilSwiftKit", "Rainbow", "Yams"]
            ),
            .target(
                name: "ToolkitTester",
                dependencies: ["Files", "Moderator", "SwiftShell", "Stencil", "StencilSwiftKit", "Toolkit", "Rainbow", "Yams"]
            ),
            .target(
                name: "Timer",
                dependencies: ["Files", "Moderator", "SwiftShell", "Stencil", "StencilSwiftKit", "Toolkit", "Rainbow", "Yams"]
            ),
            .testTarget(
                name: "ToolkitTests",
                dependencies: ["Toolkit"]
            )
        ]
    )
    
    opened by FunkyMonkey14 6
  • Remove rules_cc dependency

    Remove rules_cc dependency

    The previous plan to move the cc rules into this repo have been stalled. Having this load requires downstream users to include that repo that is just a shim to the main repo in the cc_library case.

    opened by keith 0
  • Yams without Foundation?

    Yams without Foundation?

    The state of Foundation on non Apple platforms continues to be less than ideal and brings the additional burden of increased binary size and memory footprint. Many libraries take effort the factor out their Foundation dependency in a separate module (eg. karwa/swift-url, apple/swift-nio, discussion swift-server/async-http-client, ...).

    As an example, a simple "Hello World" Swift binary compiled with swift build -c release --static-swift-stdlib on swift:5.7.1 weighs in at 7.6M. Adding the Yams dependency increases the binary size to 50M.

    Of course, not relying on Foundation is not trivial, but would be good to at least map out what would need to be done to make it happen.

    opened by t089 9
  • Compatible with SwiftyJSON

    Compatible with SwiftyJSON

    Ran into a SwiftyJSON compatibility issue that only occurs when a ':' appears in the parsed string. Here's the code:

    struct Model: Codable {
        let name: String
        let repo: JSON?
    }
    
    let model = Model(name: "Yams", repo: "git:Yams")
            
    let encoder = YAMLEncoder()
    let encodeStr = try! encoder.encode(model)
            
    let newModel = try! decoder.decode(RuleRepo.self, from: encodeStr)
    print(newModel.repo) // output: Optional(0)
    

    the key is the : of git:Yams.

    opened by zhangferry 0
  • Adds the ability to access a Node's `tag` during decoding

    Adds the ability to access a Node's `tag` during decoding

    Summary

    Enables access of a Node's tag: e.g. !DanceEvent

    structure:
      version: 0.1.0
      actions:
        8a139ac7: !DanceEvent
          type: happy
    

    During the decoding function of Codable objects:

     required init(from decoder: Decoder) throws {
          ...
          print("\(decoder.tag)") //!DanceEvent
          ...
    

    Background

    See https://github.com/jpsim/Yams/issues/265

    Enables an avenue to decode polymorphic types.

    opened by ssgutierrez42 0
  • Fix `YAMLDecoder`'s handling when decoding empty strings into optional types

    Fix `YAMLDecoder`'s handling when decoding empty strings into optional types

    Background

    I was checking the feasibility of using YAMLDecoder to decode a simple JSON file instead of having to switch between JSONDecoder, but I noticed a discrepancy in a really simple example:

    let json = """
        {
          "access": ""
        }
        """
    
    struct Container: Decodable {
        let access: String?
    }
    
    let decoded = try YAMLDecoder().decode(Container.self, from: json)
    XCTAssertEqual(decoded.access, "") // failed: ("nil") is not equal to ("Optional("")")
    

    This was odd, because the problem does not surface when using Yams.load(yaml:):

    let json = """
        {
          "access": ""
        }
        """
    
    let decoded = try XCTUnwrap(try Yams.load(yaml: json) as? NSDictionary)
    XCTAssertEqual(decoded, ["access": ""]) // success
    

    It was then where I discovered #301.

    Description

    Disclaimer: This is my first time ever looking at this codebase, so I likely will have missed something 🙏

    Following the hints from @JensAyton, I could see in NSNull.construct(from:) that we weren't factoring in the style of the input scalar, which meant that technically this method would treat 'null' or '' as null. This however never seemed to surface as an issue when using Yams.load(yaml:) since the calling methods would perform additional checks on things like the node tag. _Decoder.decodeNil() on the other hand does not.

    While I could have implemented a fix in _Decoder.decodeNil(), I felt that it might be more appropriate to put it in NSNull.construct(from:), which I did here.

    In addition to the fix, I added extra test coverage to reproduce the issue and I also had to make one small adjustment to NodeTests due to this change.. I'll add a comment inline.

    Finally, I also want to reiterate another comment from @JensAyton:

    However, I’m leery of making a PR with this change since it may impact existing code with unfortunate dependencies on the current behaviour.

    I feel the same way. I'd very much appreciate thorough eyes on this. I've added what I think is appropriate test coverage, but if you think I need to do more, or if there is a better approach to fix this, please let me know 🙏

    opened by liamnichols 2
Releases(5.0.1)
This framework implements a strict JSON parser and generator in Objective-C.

SBJson 5 Chunk-based JSON parsing and generation in Objective-C. Overview SBJson's number one feature is stream/chunk-based operation. Feed the parser

null 3.8k Jan 5, 2023
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
A lightweight CSS parser for parsing and creating CSS stylesheets

SwiftCSSParser A lightweight CSS parser for Swift that uses cssparser (cpp) under the hood. Basic usage Here's a simple code snippet to get you starte

null 9 Jul 20, 2022
Jay - Pure-Swift JSON parser & formatter. Fully streamable input and output. Linux & OS X ready.

Pure-Swift JSON parser & formatter. Fully streamable input and output. Linux & OS X ready. Replacement for NSJSONSerialization.

Danielle 132 Dec 5, 2021
Functional JSON Parser - Linux Ready

Functional JSON Parser Feature Linux Ready Type-safe JSON parsing Functional value transformation Easy to parse nested value Dependency free No define

Ryo Aoyama 117 Sep 9, 2022
JSONFeed parser for swift

JSONFeed Swift parsing for JSON Feed Spec Installation Carthage You can install Carthage with Homebrew using the following command: brew update brew i

Wes 27 Aug 19, 2020
A JSON parser with concise API written in Swift.

A JSON parser with concise API written in Swift Maps JSON attributes to different Swift types with just two methods: map and mapArrayOfObjects. The li

Evgenii Neumerzhitckii 14 Aug 13, 2018
Camera App Built With Swift

Camera App Hi there! me Aldanah Aldohayan and Ebtesam Alahmari worked in this project in the end of week8 of Tuwaiq's bootcamp How did we build this A

Aldanah Aldohayan الدانه 0 Dec 3, 2021
Reddit Feed Built With Swift

RedditFeed Steps to run the application: Download the project. Open Terminal and go to the root of the project. Run pod install Open RedditFeed.xcwork

Rahul Garg 0 Dec 14, 2021
Quickly search the built-in iOS dictionary to see definitions of words. Collect words you want to remember.

Kotoba Quickly search the built-in iOS dictionary to see definitions of words. Collect words you want to remember. Installation (iPhone or iPad) Note:

Will Hains 452 Dec 26, 2022
Reflection based (Dictionary, CKRecord, NSManagedObject, Realm, JSON and XML) object mapping with extensions for Alamofire and Moya with RxSwift or ReactiveSwift

EVReflection General information At this moment the master branch is tested with Swift 4.2 and 5.0 beta If you want to continue using EVReflection in

Edwin Vermeer 964 Dec 14, 2022
A fast, convenient and nonintrusive conversion framework between JSON and model. Your model class doesn't need to extend any base class. You don't need to modify any model file.

MJExtension A fast, convenient and nonintrusive conversion framework between JSON and model. 转换速度快、使用简单方便的字典转模型框架 ?? ✍??Release Notes: more details Co

M了个J 8.5k Jan 3, 2023
A protocol to serialize Swift structs and classes for encoding and decoding.

Serpent (previously known as Serializable) is a framework made for creating model objects or structs that can be easily serialized and deserialized fr

Nodes - iOS 287 Nov 11, 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
Decodable Simple and strict, yet powerful object mapping made possible by Swift 2's error handling.

Decodable Simple and strict, yet powerful object mapping made possible by Swift 2's error handling. Greatly inspired by Argo, but without a bizillion

Johannes Lund 1k Jul 15, 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
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
JSONHelper - ✌ Convert anything into anything in one operation; JSON data into class instances, hex strings into UIColor/NSColor, y/n strings to booleans, arrays and dictionaries of these; anything you can make sense of!

JSONHelper Convert anything into anything in one operation; hex strings into UIColor/NSColor, JSON strings into class instances, y/n strings to boolea

Baris Sencan 788 Jul 19, 2022
ObjectMapper is a framework written in Swift that makes it easy for you to convert your model objects to and from JSON.

ObjectMapper is a framework written in Swift that makes it easy for you to convert your model objects (classes and structs) to and from J

Tristan Himmelman 9k Jan 2, 2023