diff --git a/.gitignore b/.gitignore index a3cd143..dd6e86f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Xcode # +.build/ build/ *.pbxuser !default.pbxuser diff --git a/JsonSerializer.xcodeproj/project.pbxproj b/JsonSerializer.xcodeproj/project.pbxproj index c5000dd..72b5fe3 100644 --- a/JsonSerializer.xcodeproj/project.pbxproj +++ b/JsonSerializer.xcodeproj/project.pbxproj @@ -68,10 +68,10 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 807EB9581C6EFEC900BAA720 /* JsonParser+Foundation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "JsonParser+Foundation.swift"; sourceTree = ""; }; - 80E3F7D41C602ACC007E1A94 /* Json.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Json.swift; path = Source/Json.swift; sourceTree = SOURCE_ROOT; }; - 80E3F7D51C602ACC007E1A94 /* JsonParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = JsonParser.swift; path = Source/JsonParser.swift; sourceTree = SOURCE_ROOT; }; - 80E3F7D71C602ACC007E1A94 /* JsonSerializer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = JsonSerializer.swift; path = Source/JsonSerializer.swift; sourceTree = SOURCE_ROOT; }; + 807EB9581C6EFEC900BAA720 /* JsonParser+Foundation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "JsonParser+Foundation.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 80E3F7D41C602ACC007E1A94 /* Json.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = Json.swift; path = Source/Json.swift; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 80E3F7D51C602ACC007E1A94 /* JsonParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = JsonParser.swift; path = Source/JsonParser.swift; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 80E3F7D71C602ACC007E1A94 /* JsonSerializer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = JsonSerializer.swift; path = Source/JsonSerializer.swift; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 80E3F7D81C602ACC007E1A94 /* ParseError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ParseError.swift; path = Source/ParseError.swift; sourceTree = SOURCE_ROOT; }; 80E3F7D91C602ACC007E1A94 /* StringUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StringUtils.swift; path = Source/StringUtils.swift; sourceTree = SOURCE_ROOT; }; E434DF561C5A1D4C00A95287 /* PureJsonSerializer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PureJsonSerializer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -81,14 +81,14 @@ FA06004F19C10B7900B4A852 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; FA06005619C10B7900B4A852 /* JsonSerializerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JsonSerializerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; FA06005919C10B7900B4A852 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - FA06005A19C10B7900B4A852 /* JsonParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JsonParserTests.swift; sourceTree = ""; }; + FA06005A19C10B7900B4A852 /* JsonParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = JsonParserTests.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; FA06006719C10CBC00B4A852 /* tweets.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = tweets.json; sourceTree = ""; }; FA06006919C1EC0900B4A852 /* ParseErrorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParseErrorTests.swift; sourceTree = ""; }; FA3AF20919C9CA5C00F9B28A /* SwiftFeed.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SwiftFeed.app; sourceTree = BUILT_PRODUCTS_DIR; }; FA3AF20C19C9CA5C00F9B28A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; FA3AF20D19C9CA5C00F9B28A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - FA3AF20F19C9CA5C00F9B28A /* MasterViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MasterViewController.swift; sourceTree = ""; }; - FA3AF21119C9CA5C00F9B28A /* DetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = ""; }; + FA3AF20F19C9CA5C00F9B28A /* MasterViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = MasterViewController.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + FA3AF21119C9CA5C00F9B28A /* DetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = DetailViewController.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; FA3AF21419C9CA5C00F9B28A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; FA3AF21619C9CA5C00F9B28A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; FA3AF21919C9CA5C00F9B28A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; @@ -100,7 +100,7 @@ FA3AF29D19CBA4AB00F9B28A /* ApiClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApiClient.swift; sourceTree = ""; }; FA5A20E319CE58B8003CEF99 /* OverlayIndicator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OverlayIndicator.swift; sourceTree = ""; }; FAF14E8319C6834A0070F09F /* StringUtilsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringUtilsTests.swift; sourceTree = ""; }; - FAF14E8519C696BD0070F09F /* JsonTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JsonTests.swift; sourceTree = ""; }; + FAF14E8519C696BD0070F09F /* JsonTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = JsonTests.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ diff --git a/JsonSerializer/JsonParser+Foundation.swift b/JsonSerializer/JsonParser+Foundation.swift index a9de51c..e9bfcd8 100644 --- a/JsonSerializer/JsonParser+Foundation.swift +++ b/JsonSerializer/JsonParser+Foundation.swift @@ -11,21 +11,21 @@ import Foundation public extension Json { var anyValue: AnyObject { switch self { - case .ObjectValue(let ob): + case .object(let ob): var mapped: [String : AnyObject] = [:] ob.forEach { key, val in mapped[key] = val.anyValue } return mapped - case .ArrayValue(let array): + case .array(let array): return array.map { $0.anyValue } - case .BooleanValue(let bool): + case .bool(let bool): return bool - case .NumberValue(let number): + case .number(let number): return number - case .StringValue(let string): + case .string(let string): return string - case .NullValue: + case .null: return NSNull() } } @@ -45,19 +45,19 @@ extension Json { // If we're coming from foundation, it will be an `NSNumber`. //This represents double, integer, and boolean. case let number as Double: - return .NumberValue(number) + return .number(number) case let string as String: - return .StringValue(string) + return .string(string) case let object as [String : AnyObject]: return from(object) case let array as [AnyObject]: - return .ArrayValue(array.map(from)) + return .array(array.map(from)) case _ as NSNull: - return .NullValue + return .null default: fatalError("Unsupported foundation type") } - return .NullValue + return .null } public static func from(_ any: [String : AnyObject]) -> Json { diff --git a/JsonSerializerTests/JsonParserTests.swift b/JsonSerializerTests/JsonParserTests.swift index cc8c858..a884cc0 100644 --- a/JsonSerializerTests/JsonParserTests.swift +++ b/JsonSerializerTests/JsonParserTests.swift @@ -7,6 +7,7 @@ // import XCTest +import Foundation class JsonDeserializerTests: XCTestCase { @@ -58,13 +59,13 @@ class JsonDeserializerTests: XCTestCase { func testStringWithMyltiBytes() { let json = try! Json.deserialize("[\"こんにちは\"]") - XCTAssertEqual(json[0]!.stringValue, "こんにちは") + XCTAssertEqual(json[0]!.string, "こんにちは") XCTAssertEqual(json.description, "[\"こんにちは\"]") } func testStringWithMyltiUnicodeScalars() { let json = try! Json.deserialize("[\"江戸前🍣\"]") - XCTAssertEqual(json[0]!.stringValue!, "江戸前🍣") + XCTAssertEqual(json[0]!.string!, "江戸前🍣") XCTAssertEqual(json[0]!.description, "\"江戸前🍣\"") XCTAssertEqual(json.description, "[\"江戸前🍣\"]") } @@ -81,41 +82,39 @@ class JsonDeserializerTests: XCTestCase { func testNumberOfExponent() { let json = try! Json.deserialize("[1e2, 1e-2, 3.14e+01]") - XCTAssertEqual(json[0]!.intValue, 100) - XCTAssertEqual(json[1]!.doubleValue, 0.01) - XCTAssertEqual("\(json[2]!.doubleValue!)", "31.4") + XCTAssertEqual(json[0]!.int, 100) + XCTAssertEqual(json[1]!.double, 0.01) + XCTAssertEqual("\(json[2]!.double!)", "31.4") } func testUnicodeEscapeSequences() { let json = try! Json.deserialize("[\"\\u003c \\u003e\"]") - XCTAssertEqual(json[0]!.stringValue!, "< >") + XCTAssertEqual(json[0]!.string!, "< >") } func testUnicodeEscapeSequencesWith32bitsUnicodeScalar() { let json = try! Json.deserialize("[\"\\u0001\\uF363\"]") - XCTAssertEqual(json[0]!.stringValue, "\u{0001F363}") + XCTAssertEqual(json[0]!.string, "\u{0001F363}") } func testUnicodeEscapeSequencesWithTwo16bitsUnicodeScalar() { let json = try! Json.deserialize("[\"\\u00015\\uF363\"]") - XCTAssertEqual(json[0]!.stringValue, "\u{0001}5\u{F363}") + XCTAssertEqual(json[0]!.string, "\u{0001}5\u{F363}") } func testTwitterJson() { let json = try! Json.deserialize(complexJsonExample("tweets")) - XCTAssertEqual(json["statuses"]![0]!["id_str"]!.stringValue, "250075927172759552") + XCTAssertEqual(json["statuses"]![0]!["id_str"]!.string, "250075927172759552") } func testStackexchangeJson() { let json = try! Json.deserialize(complexJsonExample("stackoverflow-items")) - XCTAssertEqual(json["items"]![0]!["view_count"]!.intValue, 18711) + XCTAssertEqual(json["items"]![0]!["view_count"]!.int, 18711) } - func testPerformanceExampleWithNSData() { let jsonSource = complexJsonExample("tweets") - - self.measureBlock { + self.measure { let _ = try! Json.deserialize(jsonSource) } } @@ -123,21 +122,21 @@ class JsonDeserializerTests: XCTestCase { func testPerformanceExampleWithString() { let jsonSource = String(data: complexJsonExample("tweets"), encoding: NSUTF8StringEncoding)! - self.measureBlock { + self.measure { let _ = try! Json.deserialize(jsonSource) } } func testPerformanceExampleInJSONSerialization() { let jsonSource = complexJsonExample("tweets") - self.measureBlock { - let _: AnyObject? = try! NSJSONSerialization - .JSONObjectWithData(jsonSource, options: .MutableContainers) + self.measure { + let _: AnyObject? = try! NSJSONSerialization.jsonObject(with: jsonSource, + options: .mutableContainers) } } - func complexJsonExample(name: String) -> NSData { - let bundle = NSBundle(forClass: self.dynamicType) + func complexJsonExample(_ name: String) -> NSData { + let bundle = NSBundle(for: self.dynamicType) let path = bundle.pathForResource(name, ofType: "json")! return NSData(contentsOfFile: path)! } diff --git a/JsonSerializerTests/JsonTests.swift b/JsonSerializerTests/JsonTests.swift index 7154c5c..8141c66 100644 --- a/JsonSerializerTests/JsonTests.swift +++ b/JsonSerializerTests/JsonTests.swift @@ -15,14 +15,14 @@ class JsonTests: XCTestCase { let json = try Json.deserialize("[\"foo bar\", true, false]") XCTAssertEqual(json.description, "[\"foo bar\",true,false]") - XCTAssertEqual(json[0]!.stringValue!, "foo bar") - XCTAssertEqual(json[1]!.boolValue!, true) - XCTAssertEqual(json[2]!.boolValue!, false) + XCTAssertEqual(json[0]!.string!, "foo bar") + XCTAssertEqual(json[1]!.bool!, true) + XCTAssertEqual(json[2]!.bool!, false) - XCTAssertEqual(json[3]?.stringValue, nil, "out of range") - XCTAssertEqual(json[3]?[0]?.stringValue, nil, "no such item") - XCTAssertEqual(json["no such property"]?.stringValue, nil, "no such property") - XCTAssertEqual(json["no"]?["such"]?["property"]?.stringValue, nil, "no such properties") + XCTAssertEqual(json[3]?.string, nil, "out of range") + XCTAssertEqual(json[3]?[0]?.string, nil, "no such item") + XCTAssertEqual(json["no such property"]?.string, nil, "no such property") + XCTAssertEqual(json["no"]?["such"]?["property"]?.string, nil, "no such properties") } catch { XCTFail("\(error)") } @@ -31,7 +31,7 @@ class JsonTests: XCTestCase { func testConvertFromNilLiteral() { let value: Json = nil - XCTAssertEqual(value, Json.NullValue) + XCTAssertEqual(value, Json.null) } func testConvertFromBooleanLiteral() { @@ -117,7 +117,7 @@ class JsonTests: XCTestCase { XCTAssertNotEqual(e, o0) } - func testBooleanValueEquality() { + func testboolEquality() { XCTAssertEqual(b0, b0) XCTAssertEqual(b1, b1) XCTAssertNotEqual(b0, e) @@ -138,7 +138,7 @@ class JsonTests: XCTestCase { XCTAssertNotEqual(n0, o0) } - func testStringValueEquality() { + func teststringEquality() { XCTAssertEqual(s0, s0) XCTAssertEqual(s1, s1) XCTAssertNotEqual(s0, e) @@ -149,7 +149,7 @@ class JsonTests: XCTestCase { XCTAssertNotEqual(s0, o0) } - func testArrayValueEquality() { + func testarrayEquality() { XCTAssertEqual(a0, a0) XCTAssertEqual(a1, a1) XCTAssertNotEqual(a0, e) @@ -160,7 +160,7 @@ class JsonTests: XCTestCase { XCTAssertNotEqual(a0, o0) } - func testObjectValueEquality() { + func testobjectEquality() { XCTAssertEqual(o0, o0) XCTAssertEqual(o1, o1) XCTAssertNotEqual(o0, e) diff --git a/Package.swift b/Package.swift index 74175b7..1a7d82f 100644 --- a/Package.swift +++ b/Package.swift @@ -1,5 +1,5 @@ import PackageDescription let package = Package( - name: "PureJsonSerializer" + name: "PureJson" ) diff --git a/Source/Json.swift b/Source/Json.swift index 5788e4e..6307bc4 100644 --- a/Source/Json.swift +++ b/Source/Json.swift @@ -8,55 +8,55 @@ public enum Json: CustomStringConvertible, CustomDebugStringConvertible, Equatable { - case NullValue - case BooleanValue(Bool) - case NumberValue(Double) - case StringValue(String) - case ArrayValue([Json]) - case ObjectValue([String:Json]) + case null + case bool(Bool) + case number(Double) + case string(String) + case array([Json]) + case object([String:Json]) // MARK: Initialization public init(_ value: Bool) { - self = .BooleanValue(value) + self = .bool(value) } public init(_ value: Double) { - self = .NumberValue(value) + self = .number(value) } public init(_ value: String) { - self = .StringValue(value) + self = .string(value) } public init(_ value: [Json]) { - self = .ArrayValue(value) + self = .array(value) } public init(_ value: [String : Json]) { - self = .ObjectValue(value) + self = .object(value) } // MARK: From public static func from(_ value: Bool) -> Json { - return .BooleanValue(value) + return .bool(value) } public static func from(_ value: Double) -> Json { - return .NumberValue(value) + return .number(value) } public static func from(_ value: String) -> Json { - return .StringValue(value) + return .string(value) } public static func from(_ value: [Json]) -> Json { - return .ArrayValue(value) + return .array(value) } public static func from(_ value: [String : Json]) -> Json { - return .ObjectValue(value) + return .object(value) } } @@ -100,14 +100,14 @@ extension Json { extension Json { public var isNull: Bool { - guard case .NullValue = self else { return false } + guard case .null = self else { return false } return true } - public var boolValue: Bool? { - if case let .BooleanValue(bool) = self { + public var bool: Bool? { + if case let .bool(bool) = self { return bool - } else if let integer = intValue where integer == 1 || integer == 0 { + } else if let integer = int where integer == 1 || integer == 0 { // When converting from foundation type `[String : AnyObject]`, something that I see as important, // it's not possible to distinguish between 'bool', 'double', and 'int'. // Because of this, if we have an integer that is 0 or 1, and a user is requesting a boolean val, @@ -118,47 +118,47 @@ extension Json { } } - public var floatValue: Float? { - guard let double = doubleValue else { return nil } + public var float: Float? { + guard let double = double else { return nil } return Float(double) } - public var doubleValue: Double? { - guard case let .NumberValue(double) = self else { + public var double: Double? { + guard case let .number(double) = self else { return nil } return double } - public var intValue: Int? { - guard case let .NumberValue(double) = self where double % 1 == 0 else { + public var int: Int? { + guard case let .number(double) = self where double % 1 == 0 else { return nil } return Int(double) } - public var uintValue: UInt? { - guard let intValue = intValue else { return nil } + public var uint: UInt? { + guard let intValue = int else { return nil } return UInt(intValue) } - public var stringValue: String? { - guard case let .StringValue(string) = self else { + public var string: String? { + guard case let .string(string) = self else { return nil } return string } - public var arrayValue: [Json]? { - guard case let .ArrayValue(array) = self else { return nil } + public var array: [Json]? { + guard case let .array(array) = self else { return nil } return array } - public var objectValue: [String : Json]? { - guard case let .ObjectValue(object) = self else { return nil } + public var object: [String : Json]? { + guard case let .object(object) = self else { return nil } return object } } @@ -166,17 +166,17 @@ extension Json { extension Json { public subscript(index: Int) -> Json? { assert(index >= 0) - guard let array = arrayValue where index < array.count else { return nil } + guard let array = self.array where index < array.count else { return nil } return array[index] } public subscript(key: String) -> Json? { get { - guard let dict = objectValue else { return nil } + guard let dict = self.object else { return nil } return dict[key] } set { - guard let object = objectValue else { fatalError("Unable to set string subscript on non-object type!") } + guard let object = self.object else { fatalError("Unable to set string subscript on non-object type!") } var mutableObject = object mutableObject[key] = newValue self = .from(mutableObject) @@ -203,22 +203,22 @@ extension Json { public func ==(lhs: Json, rhs: Json) -> Bool { switch lhs { - case .NullValue: + case .null: return rhs.isNull - case .BooleanValue(let lhsValue): - guard let rhsValue = rhs.boolValue else { return false } + case .bool(let lhsValue): + guard let rhsValue = rhs.bool else { return false } return lhsValue == rhsValue - case .StringValue(let lhsValue): - guard let rhsValue = rhs.stringValue else { return false } + case .string(let lhsValue): + guard let rhsValue = rhs.string else { return false } return lhsValue == rhsValue - case .NumberValue(let lhsValue): - guard let rhsValue = rhs.doubleValue else { return false } + case .number(let lhsValue): + guard let rhsValue = rhs.double else { return false } return lhsValue == rhsValue - case .ArrayValue(let lhsValue): - guard let rhsValue = rhs.arrayValue else { return false } + case .array(let lhsValue): + guard let rhsValue = rhs.array else { return false } return lhsValue == rhsValue - case .ObjectValue(let lhsValue): - guard let rhsValue = rhs.objectValue else { return false } + case .object(let lhsValue): + guard let rhsValue = rhs.object else { return false } return lhsValue == rhsValue } } @@ -227,25 +227,25 @@ public func ==(lhs: Json, rhs: Json) -> Bool { extension Json: NilLiteralConvertible { public init(nilLiteral value: Void) { - self = .NullValue + self = .null } } extension Json: BooleanLiteralConvertible { public init(booleanLiteral value: BooleanLiteralType) { - self = .BooleanValue(value) + self = .bool(value) } } extension Json: IntegerLiteralConvertible { public init(integerLiteral value: IntegerLiteralType) { - self = .NumberValue(Double(value)) + self = .number(Double(value)) } } extension Json: FloatLiteralConvertible { public init(floatLiteral value: FloatLiteralType) { - self = .NumberValue(Double(value)) + self = .number(Double(value)) } } @@ -254,21 +254,21 @@ extension Json: StringLiteralConvertible { public typealias ExtendedGraphemeClusterLiteralType = String public init(unicodeScalarLiteral value: UnicodeScalarLiteralType) { - self = .StringValue(value) + self = .string(value) } public init(extendedGraphemeClusterLiteral value: ExtendedGraphemeClusterType) { - self = .StringValue(value) + self = .string(value) } public init(stringLiteral value: StringLiteralType) { - self = .StringValue(value) + self = .string(value) } } extension Json: ArrayLiteralConvertible { public init(arrayLiteral elements: Json...) { - self = .ArrayValue(elements) + self = .array(elements) } } @@ -278,6 +278,6 @@ extension Json: DictionaryLiteralConvertible { elements.forEach { key, value in object[key] = value } - self = .ObjectValue(object) + self = .object(object) } } diff --git a/Source/JsonParser.swift b/Source/JsonParser.swift index 068942c..f91b1d8 100644 --- a/Source/JsonParser.swift +++ b/Source/JsonParser.swift @@ -38,7 +38,7 @@ internal final class JsonDeserializer: Parser { } private var nextChar: Char { - return source[cur.successor()] + return source[cur + 1] } private var currentSymbol: Character { @@ -78,11 +78,11 @@ internal final class JsonDeserializer: Parser { switch currentChar { case Char(ascii: "n"): - return try parseSymbol("null", Json.NullValue) + return try parseSymbol("null", Json.null) case Char(ascii: "t"): - return try parseSymbol("true", Json.BooleanValue(true)) + return try parseSymbol("true", Json.bool(true)) case Char(ascii: "f"): - return try parseSymbol("false", Json.BooleanValue(false)) + return try parseSymbol("false", Json.bool(false)) case Char(ascii: "-"), Char(ascii: "0") ... Char(ascii: "9"): return try parseNumber() case Char(ascii: "\""): @@ -96,7 +96,7 @@ internal final class JsonDeserializer: Parser { } } - private func parseSymbol(_ target: StaticString, @autoclosure _ iftrue: () -> Json) throws -> Json { + private func parseSymbol(_ target: StaticString, _ iftrue: @autoclosure () -> Json) throws -> Json { guard expect(target) else { throw UnexpectedTokenError("expected \"\(target)\" but \(currentSymbol)", self) } @@ -139,7 +139,7 @@ internal final class JsonDeserializer: Parser { buffer.append(0) // trailing nul - return .StringValue(String(cString: buffer)) + return .string(String(cString: buffer)) } private func parseEscapedChar() -> UnicodeScalar? { @@ -239,7 +239,7 @@ internal final class JsonDeserializer: Parser { exponent *= expSign } - return .NumberValue(sign * (Double(integer) + fraction) * pow(10, Double(exponent))) + return .number(sign * (Double(integer) + fraction) * pow(10, Double(exponent))) } private func parseObject() throws -> Json { @@ -257,7 +257,7 @@ internal final class JsonDeserializer: Parser { var object = [String:Json]() while cur != end && !expect("}") { - guard case let .StringValue(key) = try deserializeNextValue() else { + guard case let .string(key) = try deserializeNextValue() else { throw NonStringKeyError("unexpected value for object key", self) } @@ -281,7 +281,7 @@ internal final class JsonDeserializer: Parser { } } - return .ObjectValue(object) + return .object(object) } private func parseArray() throws -> Json { @@ -307,7 +307,7 @@ internal final class JsonDeserializer: Parser { } - return .ArrayValue(a) + return .array(a) } private func expect(_ target: StaticString) -> Bool { @@ -388,7 +388,7 @@ extension JsonDeserializer.Char { } extension Collection { - func prefixUntil(@noescape _ stopCondition: Generator.Element -> Bool) -> Array { + func prefixUntil(_ stopCondition: @noescape Generator.Element -> Bool) -> Array { var prefix: [Generator.Element] = [] for element in self { guard !stopCondition(element) else { return prefix } diff --git a/Source/JsonSerializer.swift b/Source/JsonSerializer.swift index d147c85..8d7bfdc 100644 --- a/Source/JsonSerializer.swift +++ b/Source/JsonSerializer.swift @@ -17,17 +17,17 @@ internal class DefaultJsonSerializer: JsonSerializer { internal func serialize(_ json: Json) -> String { switch json { - case .NullValue: + case .null: return "null" - case .BooleanValue(let b): + case .bool(let b): return b ? "true" : "false" - case .NumberValue(let n): + case .number(let n): return serializeNumber(n) - case .StringValue(let s): + case .string(let s): return escapeAsJsonString(s) - case .ArrayValue(let a): + case .array(let a): return serializeArray(a) - case .ObjectValue(let o): + case .object(let o): return serializeObject(o) } } diff --git a/SwiftFeed/DetailViewController.swift b/SwiftFeed/DetailViewController.swift index 28f20a3..ac6a237 100644 --- a/SwiftFeed/DetailViewController.swift +++ b/SwiftFeed/DetailViewController.swift @@ -22,10 +22,10 @@ class DetailViewController: UIViewController, UIWebViewDelegate { } func configureView() { - title = detailItem["title"]?.stringValue + title = detailItem["title"]?.string guard - let urlString = detailItem["link"]?.stringValue, + let urlString = detailItem["link"]?.string, let url = NSURL(string: urlString) else { return } diff --git a/SwiftFeed/MasterViewController.swift b/SwiftFeed/MasterViewController.swift index 285707f..0fc0a3a 100644 --- a/SwiftFeed/MasterViewController.swift +++ b/SwiftFeed/MasterViewController.swift @@ -33,8 +33,8 @@ class MasterViewController: UITableViewController { switch result { case .Success(let json): - NSLog("quota max: %@", json["quota_max"]?.stringValue ?? "") - self.entries = json["items"]?.arrayValue ?? [] + NSLog("quota max: %@", json["quota_max"]?.string ?? "") + self.entries = json["items"]?.array ?? [] self.tableView.reloadData() case .Error(let error): print("Error: \(error)") @@ -70,7 +70,7 @@ class MasterViewController: UITableViewController { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) let object = entries[indexPath.row] - cell.textLabel?.text = object["title"]?.stringValue + cell.textLabel?.text = object["title"]?.string if let timeInterval = object["last_activity_date"]?.doubleValue { let date = NSDate(timeIntervalSince1970: timeInterval)