         indirect case Array(name: Swift.String?, values: [Value])
     }
 
+    lazy var numberScanningSet: NSCharacterSet = {
+        let symbolSet = NSMutableCharacterSet.decimalDigitCharacterSet()
+        symbolSet.addCharactersInString(".-")
+        return symbolSet
+    }()
+
+    lazy var stringScanningSet: NSCharacterSet = {
+        let symbolSet = NSMutableCharacterSet.alphanumericCharacterSet()
+        symbolSet.formUnionWithCharacterSet(NSCharacterSet.punctuationCharacterSet())
+        symbolSet.formUnionWithCharacterSet(NSCharacterSet.symbolCharacterSet())
+        symbolSet.formUnionWithCharacterSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
+        symbolSet.removeCharactersInString("\"")
+        return symbolSet
+    }()
+
     private func generateTokens() -> [Token] {
 
         func scanBeginObject() -> Token? {


        func scanString() -> Token? {

            let symbolSet = NSMutableCharacterSet.alphanumericCharacterSet()
            symbolSet.formUnionWithCharacterSet(NSCharacterSet.punctuationCharacterSet())
            symbolSet.formUnionWithCharacterSet(NSCharacterSet.symbolCharacterSet())
            symbolSet.formUnionWithCharacterSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
            symbolSet.removeCharactersInString("\"")

            var string: NSString?

            if scanner.scanString("\"", intoString: nil) &&
                scanner.scanCharactersFromSet(symbolSet, intoString: &string) &&
                scanner.scanString("\"", intoString: nil) {

                    if let string = string as? String {


        func scanNumber() -> Token? {

            var string: NSString?

            if scanner.scanCharactersFromSet(numberScanningSet, intoString: &string) {

                if let string = string as? String {

