{"id":15459218,"url":"https://github.com/marcprux/universal","last_synced_at":"2025-12-11T22:53:28.894Z","repository":{"id":63910949,"uuid":"42466311","full_name":"marcprux/universal","owner":"marcprux","description":"Tiny zero-dependency cross-platform Swift parsers for JSON, XML, and YAML incl. in-memory interchange formats and Either type","archived":false,"fork":false,"pushed_at":"2025-04-05T02:48:59.000Z","size":26685,"stargazers_count":13,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-19T20:59:49.759Z","etag":null,"topics":["codable","json","json-library","json-schema","swift","swift-package-manager","yaml"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/marcprux.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2015-09-14T17:49:56.000Z","updated_at":"2025-04-05T02:49:02.000Z","dependencies_parsed_at":"2024-11-08T17:01:16.739Z","dependency_job_id":"f980100e-0440-4794-9973-3d8d4de12c31","html_url":"https://github.com/marcprux/universal","commit_stats":{"total_commits":676,"total_committers":6,"mean_commits":"112.66666666666667","dds":"0.39644970414201186","last_synced_commit":"50ada3fd9d2726b05cc2ff460a92e8b65b1c2414"},"previous_names":["glimpseio/bricbrac","marcprux/bricbrac"],"tags_count":35,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcprux%2Funiversal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcprux%2Funiversal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcprux%2Funiversal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcprux%2Funiversal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/marcprux","download_url":"https://codeload.github.com/marcprux/universal/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250221273,"owners_count":21394680,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["codable","json","json-library","json-schema","swift","swift-package-manager","yaml"],"created_at":"2024-10-01T23:05:30.333Z","updated_at":"2025-12-11T22:53:28.884Z","avatar_url":"https://github.com/marcprux.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"Universal\n=========\n\n[![Build Status](https://github.com/marcprux/universal/workflows/universal%20ci/badge.svg?branch=main)](https://github.com/marcprux/universal/actions)\n[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fmarcprux%2Funiversal%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/marcprux/universal)\n[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fmarcprux%2Funiversal%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/marcprux/universal)\n\n\n**Universal**: A tiny zero-dependency cross-platform Swift parser and decoder for JSON, XML, YAML, and property lists.\n\n## Usage:\n\nAdd the following dependency to your `Package.swift`:\n\n```swift\n.package(url: \"https://github.com/marcprux/universal.git\", from: \"5.0.5\")\n```\n\nThe package provides the modules `Either`, `JSON`, `XML`, `YAML`, `PLIST`,\nor `Universal`, which is an umbrella module that re-exports all the other modules.\n\n\n## Example:\n\n```swift\nimport Universal\n\nfunc testUniversalExample() throws {\n    // JSON Parsing\n    let json: JSON = try JSON.parse(Data(\"\"\"\n        {\"parent\": {\"child\": 1}}\n        \"\"\".utf8))\n\n    assert(json[\"parent\"]?[\"child\"] == 1)\n    assert(json[\"parent\"]?[\"child\"] == JSON.number(1.0)) // JSON's only number is Double\n\n\n    // YAML Parsing\n    let yaml: YAML = try YAML.parse(Data(\"\"\"\n        parent:\n          child: 1\n        \"\"\".utf8))\n\n    assert(yaml[\"parent\"]?[\"child\"] == 1)\n    assert(yaml[\"parent\"]?[\"child\"] == YAML.integer(1)) // YAML can parse integers\n    assert(yaml[\"parent\"]?[\"child\"] != 1.0) // not the same as a double\n\n    let yamlJSON: JSON = try yaml.json() // convert YAML to JSON struct\n    assert(yamlJSON == json)\n\n\n    // XML Parsing\n    let xml: XML = try XML.parse(Data(\"\"\"\n        \u003cparent\u003e\u003cchild\u003e1\u003c/child\u003e\u003c/parent\u003e\n        \"\"\".utf8))\n\n    let xmlJSON: JSON = try xml.json() // convert XML to JSON struct\n\n    assert(xml[\"parent\"]?[\"child\"] == XML.string(\"1\")) // XML parses everything as strings\n\n    // fixup the XML by changing the JSON to match\n    assert(json[\"parent\"]?[\"child\"] == 1)\n    var jsonEdit = json\n    jsonEdit[\"parent\"]?[\"child\"] = JSON.string(\"1\") // update the JSON to match\n    assert(jsonEdit[\"parent\"]?[\"child\"] == \"1\") // now the JSON matches\n\n    assert(xmlJSON == jsonEdit)\n}\n```\n\n## Coding\n\nUniversal provides the ability to decode from (but not encode to) YAML and XML\nthrough their ability to convert to a `JSON` struct:\n\n\n```swift\nimport Universal\n\nstruct Coded : Decodable, Equatable {\n    let person: Person\n\n    struct Person : Decodable, Equatable {\n        let firstName: String\n        let lastName: String\n        let astrologicalSign: String\n    }\n}\n\nlet decodedFromJSON = try Coded(json: JSON.parse(Data(\"\"\"\n    {\n      \"person\": {\n        \"firstName\": \"Marc\",\n        \"lastName\": \"Prud'hommeaux\",\n        \"astrologicalSign\": \"Sagittarius\"\n      }\n    }\n    \"\"\".utf8)))\n\nlet decodedFromYAML = try Coded(json: YAML.parse(Data(\"\"\"\n    # A YAML version of a Person\n    person:\n      firstName: Marc\n      lastName: Prud'hommeaux\n      astrologicalSign: Sagittarius # what's your sign?\n    \"\"\".utf8)).json())\nassert(decodedFromJSON == decodedFromYAML)\n\nlet decodedFromXML = try Coded(json: XML.parse(Data(\"\"\"\n    \u003c!-- An XML version of a Person --\u003e\n    \u003cperson\u003e\n      \u003cfirstName\u003eMarc\u003c/firstName\u003e\n      \u003c!-- escaping and stuff --\u003e\n      \u003clastName\u003ePrud\u0026apos;hommeaux\u003c/lastName\u003e\n      \u003castrologicalSign\u003eSagittarius\u003c/astrologicalSign\u003e\n    \u003c/person\u003e\n    \"\"\".utf8)).json())\nassert(decodedFromYAML == decodedFromXML)\n\nlet decodedFromPLISTXML = try Coded(json: PLIST.parse(Data(\"\"\"\n    \u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n    \u003c!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\"\u003e\n    \u003cplist version=\"1.0\"\u003e\n    \u003cdict\u003e\n        \u003ckey\u003eperson\u003c/key\u003e\n        \u003cdict\u003e\n            \u003ckey\u003efirstName\u003c/key\u003e\n            \u003cstring\u003eMarc\u003c/string\u003e\n            \u003ckey\u003elastName\u003c/key\u003e\n            \u003cstring\u003ePrud\u0026apos;hommeaux\u003c/string\u003e\n            \u003ckey\u003eastrologicalSign\u003c/key\u003e\n            \u003cstring\u003eSagittarius\u003c/string\u003e\n        \u003c/dict\u003e\n    \u003c/dict\u003e\n    \u003c/plist\u003e\n    \"\"\".utf8)).json())\nassert(decodedFromXML == decodedFromPLISTXML)\n\nlet decodedFromPLISTOpenStep = try Coded(json: PLIST.parse(Data(\"\"\"\n    {\n        person = {\n            firstName = Marc;\n            lastName = \"Prud'hommeaux\";\n            astrologicalSign = Sagittarius;\n        };\n    }\n    \"\"\".utf8)).json())\nassert(decodedFromPLISTOpenStep == decodedFromPLISTXML)\n```\n\n[Swift Package Manager]: https://swift.org/package-manager\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcprux%2Funiversal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarcprux%2Funiversal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcprux%2Funiversal/lists"}