github.com/crossroadlabs/TidyJSON

A neat and tidy JSON package run on all Swift platforms (Linux, iOS, OS X)


License
MIT

Documentation

TidyJSON

TidyJSON is a neat and tidy JSON package run on all Swift platforms (Linux, iOS, OS X, tvOS, watchOS)

Build Status

Goals

  • simple, neat and tidy json lib
  • safe static typed without Any or AnyObject
  • performance
  • pure Swift, only dependent to builtin types
  • compatible with all Swift platforms (Linux, iOS, OS X, tvOS, watchOS)
  • concise usage
  • boxing dict and array type for mutating data
  • modify json via subscript operator
  • fully tested
  • better parse error report
  • Swift Package Manager, Carthage support

Usage

Literal Convertible

Literal value can be type safe converted to TidyJSON.JSON like this:

let jsonFalse : JSON = false
let jsonTrue : JSON = true
let jsonNull : JSON = nil
let jsonNumber : JSON = 1.2e-2
let jsonString : JSON = "hello swift"
let jsonArray : JSON = [12, "string", false, nil, true, ["nested array", 12, 1.2], ["nested dict": nil]]
let json : JSON = ["key":false, "key2":true, "key3":[1, "hello", 3, "world", ["key4":nil, "key5":12.03, "key6":12E-2, "key7": -12e-2]]]

Access value

Get and Set value via Subscripts:

var json : JSON = []
// []

let child :JSON = "string"
json.append(child)
// ["string"]

json[0] = "STRING"
// ["STRING"]

json.append(JSON([]))
// ["STRING", []]

json[1].append(JSON("hello"))
// ["STRING", ["hello"]]

json[1][0] = "world" 
// ["STRING", ["world"]]

json[1].removeAtIndex(0)  
// ["STRING", []]

json.removeAtIndex(1)
// ["STRING"]

var json1 : JSON = [:]
// {}
json1["hello"] = false 
// {"hello":false}

json1["world"] = true
// {"hello":false, "world":true}

// remove a key
json1["hello"] = nil
// {"world":true}

json1["world"] = [1,2,3]
// {"world":[1,2,3]}

Parse from String

let json1 = try! JSON.parse("{\"key\" : false }")
if let b = json1["key"].bool {
    print(b)
}
/*
false
*/

let json2 = try! JSON.parse("{\"key\" : [\" \\u0041334 \\n \\t \\\" \"]}")

if let x = json2["key"][0].string {
    print(x)
}
/*
 A334 
         " 
*/

Loop

let jsonArray : JSON = [12, "string", false, nil, true]
// for Array, key is string of current index
for (k, v) in jsonArray {
    print("key: \(k), value: \(v)")
}
/* 
key: 0, value: Number(12.0)
key: 1, value: String("string")
key: 2, value: Boolean(false)
key: 3, value: Null
key: 4, value: Boolean(true)
*/

let json : JSON = ["key1":false, "key2":true, "key3": 123, "key4": "hello"]

for (k, v) in json {
    print("key: \(k), value: \(v)")
}
/*
key: key, value: Boolean(false)
key: key2, value: Boolean(true)
key: key4, value: String("hello")
key: key1, value: Boolean(false)
key: key3, value: Number(123.0)
*/

Dump to String

let json2 = try! JSON.parse("{\"key\" : \" \\u0041334 \\n \\t \\\" \"}")
print(json2.dump())
// {"key":" A334 \n \t \" "}

Test

On Linux platform you need install XCTest

After install XCTest, run sh run_test.sh

Integration

Carthage

To integrate TidyJSON into your Xcode project using Carthage, specify it in your Cartfile:

github "benloong/TidyJSON"

Swift Package Manager

Currently support Swift Package Manager to install TidyJSON by adding the proper description to your Package.swift file:

import PackageDescription

let package = Package(
    name: "YOUR_PROJECT_NAME",
    targets: [],
    dependencies: [
        .Package(url: "https://github.com/benloong/TidyJSON.git", majorVersion: 1)
    ]
)

License

MIT license