0001 // JSONParser.swift 0002 // 0003 // The MIT License (MIT) 0004 // 0005 // Copyright (c) 2015 Zewo 0006 // 0007 // Permission is hereby granted, free of charge, to any person obtaining a copy 0008 // of this software and associated documentation files (the "Software"), to deal 0009 // in the Software without restriction, including without limitation the rights 0010 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 0011 // copies of the Software, and to permit persons to whom the Software is 0012 // furnished to do so, subject to the following conditions: 0013 // 0014 // The above copyright notice and this permission notice shall be included in all 0015 // copies or substantial portions of the Software. 0016 // 0017 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 0018 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 0019 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 0020 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 0021 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 0022 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 0023 // SOFTWARE. 0024 // 0025 // This file has been modified from its original project Swift-JsonSerializer 0026 0027 #if os(Linux) 0028 import Glibc 0029 #else 0030 import Darwin.C 0031 #endif 0032 0033 public struct JSONParser { 0034 public static func parse(source: String) throws -> JSON { 0035 return try GenericJSONParser(source.utf8).parse() 0036 } 0037 0038 public static func parse(source: [UInt8]) throws -> JSON { 0039 return try GenericJSONParser(source).parse() 0040 } 0041 0042 public static func parse(source: [Int8]) throws -> JSON { 0043 return try parse(source.map({UInt8(bitPattern: $0)})) 0044 } 0045 } 0046 0047 public class GenericJSONParser
JSONParser.swift:43 return try parse(source.map({UInt8(bitPattern: $0)}))<ByteSequence
JSONParser.swift:35 return try GenericJSONParser(source.utf8).parse()JSONParser.swift:39 return try GenericJSONParser(source).parse()JSONParser.swift:81 extension GenericJSONParser {: CollectionType where ByteSequence.Generator.Element == UInt8> { 0048 public typealias Source
JSONParser.swift:48 public typealias Source = ByteSequence= ByteSequence 0049 typealias Char
JSONParser.swift:49 typealias Char = Source.Generator.ElementJSONParser.swift:51 let source: SourceJSONParser.swift:52 var cur: Source.IndexJSONParser.swift:53 let end: Source.IndexJSONParser.swift:58 public init(_ source: Source) {= Source.Generator.Element 0050 0051 let source
JSONParser.swift:93 case Char(ascii: "n"): return try parseSymbol("null", JSON.NullValue)JSONParser.swift:94 case Char(ascii: "t"): return try parseSymbol("true", JSON.BooleanValue(true))JSONParser.swift:95 case Char(ascii: "f"): return try parseSymbol("false", JSON.BooleanValue(false))JSONParser.swift:96 case Char(ascii: "-"), Char(ascii: "0") ... Char(ascii: "9"): return try parseNumber()JSONParser.swift:96 case Char(ascii: "-"), Char(ascii: "0") ... Char(ascii: "9"): return try parseNumber()JSONParser.swift:96 case Char(ascii: "-"), Char(ascii: "0") ... Char(ascii: "9"): return try parseNumber()JSONParser.swift:97 case Char(ascii: "\""): return try parseString()JSONParser.swift:98 case Char(ascii: "{"): return try parseObject()JSONParser.swift:99 case Char(ascii: "["): return try parseArray()JSONParser.swift:108 private var currentChar: Char {JSONParser.swift:112 private var nextChar: Char {JSONParser.swift:133 assert(currentChar == Char(ascii: "\""), "points a double quote")JSONParser.swift:139 case Char(ascii: "\\"):JSONParser.swift:160 case Char(ascii: "\""): break LOOPJSONParser.swift:213 case Char(ascii: "0"): advance()JSONParser.swift:214 case Char(ascii: "1") ... Char(ascii: "9"):JSONParser.swift:214 case Char(ascii: "1") ... Char(ascii: "9"):JSONParser.swift:302 assert(currentChar == Char(ascii: "{"), "points \"{\"")JSONParser.swift:351 assert(currentChar == Char(ascii: "["), "points \"[\"")JSONParser.swift:415 private func isIdentifier(char: Char) -> Bool {JSONParser.swift:417 case Char(ascii: "a") ... Char(ascii: "z"):JSONParser.swift:417 case Char(ascii: "a") ... Char(ascii: "z"):JSONParser.swift:431 case Char(ascii: "\n"):JSONParser.swift:444 case Char(ascii: " "), Char(ascii: "\t"), Char(ascii: "\r"), Char(ascii: "\n"):JSONParser.swift:444 case Char(ascii: " "), Char(ascii: "\t"), Char(ascii: "\r"), Char(ascii: "\n"):JSONParser.swift:444 case Char(ascii: " "), Char(ascii: "\t"), Char(ascii: "\r"), Char(ascii: "\n"):JSONParser.swift:444 case Char(ascii: " "), Char(ascii: "\t"), Char(ascii: "\r"), Char(ascii: "\n"):: Source 0052 var cur
JSONParser.swift:59 self.source = sourceJSONParser.swift:109 return source[cur]JSONParser.swift:113 return source[cur.successor()]: Source.Index 0053 let end
JSONParser.swift:60 self.cur = source.startIndexJSONParser.swift:67 if (cur == end) {JSONParser.swift:84 if cur == end {JSONParser.swift:109 return source[cur]JSONParser.swift:113 return source[cur.successor()]JSONParser.swift:137 LOOP: while cur != end {JSONParser.swift:141 if (cur == end) {JSONParser.swift:215 while cur != end {JSONParser.swift:245 while cur != end {JSONParser.swift:277 while cur != end {JSONParser.swift:307 LOOP: while cur != end && !expect("}") {JSONParser.swift:357 LOOP: while cur != end && !expect("]") {JSONParser.swift:380 if cur == end {JSONParser.swift:393 let start = curJSONParser.swift:402 cur = startJSONParser.swift:425 assert(cur != end, "out of range")JSONParser.swift:426 cur++JSONParser.swift:428 if cur != end {JSONParser.swift:442 while cur != end {: Source.Index 0054 0055 public var lineNumber
JSONParser.swift:61 self.end = source.endIndexJSONParser.swift:67 if (cur == end) {JSONParser.swift:84 if cur == end {JSONParser.swift:137 LOOP: while cur != end {JSONParser.swift:141 if (cur == end) {JSONParser.swift:215 while cur != end {JSONParser.swift:245 while cur != end {JSONParser.swift:277 while cur != end {JSONParser.swift:307 LOOP: while cur != end && !expect("}") {JSONParser.swift:357 LOOP: while cur != end && !expect("]") {JSONParser.swift:380 if cur == end {JSONParser.swift:425 assert(cur != end, "out of range")JSONParser.swift:428 if cur != end {JSONParser.swift:442 while cur != end {= 1 0056 public var columnNumber
JSONParser.swift:72 lineNumber: lineNumber,JSONParser.swift:87 lineNumber: lineNumber,JSONParser.swift:102 lineNumber: lineNumber,JSONParser.swift:126 lineNumber: lineNumber,JSONParser.swift:144 lineNumber: lineNumber,JSONParser.swift:156 lineNumber: lineNumber,JSONParser.swift:169 lineNumber: lineNumber,JSONParser.swift:226 lineNumber: lineNumber,JSONParser.swift:234 lineNumber: lineNumber,JSONParser.swift:259 lineNumber: lineNumber,JSONParser.swift:290 lineNumber: lineNumber,JSONParser.swift:317 lineNumber: lineNumber,JSONParser.swift:334 lineNumber: lineNumber,JSONParser.swift:341 lineNumber: lineNumber,JSONParser.swift:369 lineNumber: lineNumber,JSONParser.swift:394 let l = lineNumberJSONParser.swift:403 lineNumber = lJSONParser.swift:432 lineNumber++= 1 0057 0058 public init
JSONParser.swift:73 columnNumber: columnNumberJSONParser.swift:88 columnNumber: columnNumberJSONParser.swift:103 columnNumber: columnNumberJSONParser.swift:127 columnNumber: columnNumberJSONParser.swift:145 columnNumber: columnNumberJSONParser.swift:157 columnNumber: columnNumberJSONParser.swift:170 columnNumber: columnNumberJSONParser.swift:227 columnNumber: columnNumberJSONParser.swift:235 columnNumber: columnNumberJSONParser.swift:260 columnNumber: columnNumberJSONParser.swift:291 columnNumber: columnNumberJSONParser.swift:318 columnNumber: columnNumberJSONParser.swift:335 columnNumber: columnNumberJSONParser.swift:342 columnNumber: columnNumberJSONParser.swift:370 columnNumber: columnNumberJSONParser.swift:395 let c = columnNumberJSONParser.swift:404 columnNumber = cJSONParser.swift:433 columnNumber = 1JSONParser.swift:436 columnNumber++(_ source: Source) { 0059 self.source = source 0060 self.cur = source.startIndex 0061 self.end = source.endIndex 0062 } 0063 0064 public func parse
JSONParser.swift:35 return try GenericJSONParser(source.utf8).parse()JSONParser.swift:39 return try GenericJSONParser(source).parse()() throws -> JSON { 0065 let JSON = try parseValue() 0066 skipWhitespaces() 0067 if (cur == end) { 0068 return JSON 0069 } else { 0070 throw JSONParseError.ExtraTokenError( 0071 reason: "extra tokens found", 0072 lineNumber: lineNumber, 0073 columnNumber: columnNumber 0074 ) 0075 } 0076 } 0077 } 0078 0079 // MARK: - Private 0080 0081 extension GenericJSONParser { 0082 private func parseValue
JSONParser.swift:35 return try GenericJSONParser(source.utf8).parse()JSONParser.swift:39 return try GenericJSONParser(source).parse()() throws -> JSON { 0083 skipWhitespaces() 0084 if cur == end { 0085 throw JSONParseError.InsufficientTokenError( 0086 reason: "unexpected end of tokens", 0087 lineNumber: lineNumber, 0088 columnNumber: columnNumber 0089 ) 0090 } 0091 0092 switch currentChar { 0093 case Char(ascii: "n"): return try parseSymbol("null", JSON.NullValue) 0094 case Char(ascii: "t"): return try parseSymbol("true", JSON.BooleanValue(true)) 0095 case Char(ascii: "f"): return try parseSymbol("false", JSON.BooleanValue(false)) 0096 case Char(ascii: "-"), Char(ascii: "0") ... Char(ascii: "9"): return try parseNumber() 0097 case Char(ascii: "\""): return try parseString() 0098 case Char(ascii: "{"): return try parseObject() 0099 case Char(ascii: "["): return try parseArray() 0100 case (let c): throw JSONParseError.UnexpectedTokenError( 0101 reason: "unexpected token: \(c)", 0102 lineNumber: lineNumber, 0103 columnNumber: columnNumber 0104 ) 0105 } 0106 } 0107 0108 private var currentChar
JSONParser.swift:65 let JSON = try parseValue()JSONParser.swift:308 let keyValue = try parseValue()JSONParser.swift:323 let value = try parseValue()JSONParser.swift:358 let JSON = try parseValue(): Char { 0109 return source[cur] 0110 } 0111 0112 private var nextChar
JSONParser.swift:92 switch currentChar {JSONParser.swift:117 return Character(UnicodeScalar(currentChar))JSONParser.swift:133 assert(currentChar == Char(ascii: "\""), "points a double quote")JSONParser.swift:138 switch currentChar {JSONParser.swift:161 default: buffer.append(CChar(bitPattern: currentChar))JSONParser.swift:180 let c = UnicodeScalar(currentChar)JSONParser.swift:203 let c = UnicodeScalar(currentChar)JSONParser.swift:212 switch currentChar {JSONParser.swift:216 if let value = digitToInt(currentChar) {JSONParser.swift:246 if let value = digitToInt(currentChar) {JSONParser.swift:278 if let value = digitToInt(currentChar) {JSONParser.swift:302 assert(currentChar == Char(ascii: "{"), "points \"{\"")JSONParser.swift:351 assert(currentChar == Char(ascii: "["), "points \"[\"")JSONParser.swift:385 if target.utf8Start.memory == currentChar {JSONParser.swift:401 if p.memory != currentChar {JSONParser.swift:429 switch currentChar {JSONParser.swift:443 switch currentChar {: Char { 0113 return source[cur.successor()] 0114 } 0115 0116 private var currentSymbol
JSONParser.swift:186 while let d = hexToDigit(nextChar) {: Character { 0117 return Character(UnicodeScalar(currentChar)) 0118 } 0119 0120 private func parseSymbol
JSONParser.swift:125 reason: "expected \"\(target)\" but \(currentSymbol)",JSONParser.swift:368 reason: "missing comma (,) (token: \(currentSymbol))",(target: StaticString, @autoclosure _ iftrue: Void -> JSON) throws -> JSON { 0121 if expect(target) { 0122 return iftrue() 0123 } else { 0124 throw JSONParseError.UnexpectedTokenError( 0125 reason: "expected \"\(target)\" but \(currentSymbol)", 0126 lineNumber: lineNumber, 0127 columnNumber: columnNumber 0128 ) 0129 } 0130 } 0131 0132 private func parseString
JSONParser.swift:93 case Char(ascii: "n"): return try parseSymbol("null", JSON.NullValue)JSONParser.swift:94 case Char(ascii: "t"): return try parseSymbol("true", JSON.BooleanValue(true))JSONParser.swift:95 case Char(ascii: "f"): return try parseSymbol("false", JSON.BooleanValue(false))() throws -> JSON { 0133 assert(currentChar == Char(ascii: "\""), "points a double quote") 0134 advance() 0135 var buffer: [CChar] = [] 0136 0137 LOOP: while cur != end { 0138 switch currentChar { 0139 case Char(ascii: "\\"): 0140 advance() 0141 if (cur == end) { 0142 throw JSONParseError.InvalidStringError( 0143 reason: "unexpected end of a string literal", 0144 lineNumber: lineNumber, 0145 columnNumber: columnNumber 0146 ) 0147 } 0148 0149 if let c = parseEscapedChar() { 0150 for u in String(c).utf8 { 0151 buffer.append(CChar(bitPattern: u)) 0152 } 0153 } else { 0154 throw JSONParseError.InvalidStringError( 0155 reason: "invalid escape sequence", 0156 lineNumber: lineNumber, 0157 columnNumber: columnNumber 0158 ) 0159 } 0160 case Char(ascii: "\""): break LOOP 0161 default: buffer.append(CChar(bitPattern: currentChar)) 0162 } 0163 advance() 0164 } 0165 0166 if !expect("\"") { 0167 throw JSONParseError.InvalidStringError( 0168 reason: "missing double quote", 0169 lineNumber: lineNumber, 0170 columnNumber: columnNumber 0171 ) 0172 } 0173 0174 buffer.append(0) 0175 let s = String.fromCString(buffer)! 0176 return .StringValue(s) 0177 } 0178 0179 private func parseEscapedChar
JSONParser.swift:97 case Char(ascii: "\""): return try parseString()() -> UnicodeScalar? { 0180 let c = UnicodeScalar(currentChar) 0181 0182 if c == "u" { 0183 var length = 0 0184 var value: UInt32 = 0 0185 0186 while let d = hexToDigit(nextChar) { 0187 advance() 0188 length++ 0189 0190 if length > 8 { 0191 break 0192 } 0193 0194 value = (value << 4) | d 0195 } 0196 0197 if length < 2 { 0198 return nil 0199 } 0200 0201 return UnicodeScalar(value) 0202 } else { 0203 let c = UnicodeScalar(currentChar) 0204 return unescapeMapping[c] ?? c 0205 } 0206 } 0207 0208 private func parseNumber
JSONParser.swift:149 if let c = parseEscapedChar() {() throws -> JSON { 0209 let sign = expect("-") ? -1.0 : 1.0 0210 var integer: Int64 = 0 0211 0212 switch currentChar { 0213 case Char(ascii: "0"): advance() 0214 case Char(ascii: "1") ... Char(ascii: "9"): 0215 while cur != end { 0216 if let value = digitToInt(currentChar) { 0217 integer = (integer * 10) + Int64(value) 0218 } else { 0219 break 0220 } 0221 advance() 0222 } 0223 default: 0224 throw JSONParseError.InvalidStringError( 0225 reason: "missing double quote", 0226 lineNumber: lineNumber, 0227 columnNumber: columnNumber 0228 ) 0229 } 0230 0231 if integer != Int64(Double(integer)) { 0232 throw JSONParseError.InvalidNumberError( 0233 reason: "too large number", 0234 lineNumber: lineNumber, 0235 columnNumber: columnNumber 0236 ) 0237 } 0238 0239 var fraction: Double = 0.0 0240 0241 if expect(".") { 0242 var factor = 0.1 0243 var fractionLength = 0 0244 0245 while cur != end { 0246 if let value = digitToInt(currentChar) { 0247 fraction += (Double(value) * factor) 0248 factor /= 10 0249 fractionLength++ 0250 } else { 0251 break 0252 } 0253 advance() 0254 } 0255 0256 if fractionLength == 0 { 0257 throw JSONParseError.InvalidNumberError( 0258 reason: "insufficient fraction part in number", 0259 lineNumber: lineNumber, 0260 columnNumber: columnNumber 0261 ) 0262 } 0263 } 0264 0265 var exponent: Int64 = 0 0266 0267 if expect("e") || expect("E") { 0268 var expSign: Int64 = 1 0269 0270 if expect("-") { 0271 expSign = -1 0272 } else if expect("+") {} 0273 0274 exponent = 0 0275 var exponentLength = 0 0276 0277 while cur != end { 0278 if let value = digitToInt(currentChar) { 0279 exponent = (exponent * 10) + Int64(value) 0280 exponentLength++ 0281 } else { 0282 break 0283 } 0284 advance() 0285 } 0286 0287 if exponentLength == 0 { 0288 throw JSONParseError.InvalidNumberError( 0289 reason: "insufficient exponent part in number", 0290 lineNumber: lineNumber, 0291 columnNumber: columnNumber 0292 ) 0293 } 0294 0295 exponent *= expSign 0296 } 0297 0298 return .NumberValue(sign * (Double(integer) + fraction) * pow(10, Double(exponent))) 0299 } 0300 0301 private func parseObject
JSONParser.swift:96 case Char(ascii: "-"), Char(ascii: "0") ... Char(ascii: "9"): return try parseNumber()() throws -> JSON { 0302 assert(currentChar == Char(ascii: "{"), "points \"{\"") 0303 advance() 0304 skipWhitespaces() 0305 var object: [String: JSON] = [:] 0306 0307 LOOP: while cur != end && !expect("}") { 0308 let keyValue = try parseValue() 0309 0310 switch keyValue { 0311 case .StringValue(let key): 0312 skipWhitespaces() 0313 0314 if !expect(":") { 0315 throw JSONParseError.UnexpectedTokenError( 0316 reason: "missing colon (:)", 0317 lineNumber: lineNumber, 0318 columnNumber: columnNumber 0319 ) 0320 } 0321 0322 skipWhitespaces() 0323 let value = try parseValue() 0324 object[key] = value 0325 skipWhitespaces() 0326 0327 if expect(",") { 0328 break 0329 } else if expect("}") { 0330 break LOOP 0331 } else { 0332 throw JSONParseError.UnexpectedTokenError( 0333 reason: "missing comma (,)", 0334 lineNumber: lineNumber, 0335 columnNumber: columnNumber 0336 ) 0337 } 0338 default: 0339 throw JSONParseError.NonStringKeyError( 0340 reason: "unexpected value for object key", 0341 lineNumber: lineNumber, 0342 columnNumber: columnNumber 0343 ) 0344 } 0345 } 0346 0347 return .ObjectValue(object) 0348 } 0349 0350 private func parseArray
JSONParser.swift:98 case Char(ascii: "{"): return try parseObject()() throws -> JSON { 0351 assert(currentChar == Char(ascii: "["), "points \"[\"") 0352 advance() 0353 skipWhitespaces() 0354 0355 var array: [JSON] = [] 0356 0357 LOOP: while cur != end && !expect("]") { 0358 let JSON = try parseValue() 0359 skipWhitespaces() 0360 array.append(JSON) 0361 0362 if expect(",") { 0363 continue 0364 } else if expect("]") { 0365 break LOOP 0366 } else { 0367 throw JSONParseError.UnexpectedTokenError( 0368 reason: "missing comma (,) (token: \(currentSymbol))", 0369 lineNumber: lineNumber, 0370 columnNumber: columnNumber 0371 ) 0372 } 0373 } 0374 0375 return .ArrayValue(array) 0376 } 0377 0378 0379 private func expect
JSONParser.swift:99 case Char(ascii: "["): return try parseArray()(target: StaticString) -> Bool { 0380 if cur == end { 0381 return false 0382 } 0383 0384 if !isIdentifier(target.utf8Start.memory) { 0385 if target.utf8Start.memory == currentChar { 0386 advance() 0387 return true 0388 } else { 0389 return false 0390 } 0391 } 0392 0393 let start = cur 0394 let l = lineNumber 0395 let c = columnNumber 0396 0397 var p = target.utf8Start 0398 let endp = p.advancedBy(Int(target.byteSize)) 0399 0400 while p != endp { 0401 if p.memory != currentChar { 0402 cur = start 0403 lineNumber = l 0404 columnNumber = c 0405 return false 0406 } 0407 p += 1 0408 advance() 0409 } 0410 0411 return true 0412 } 0413 0414 // only "true", "false", "null" are identifiers 0415 private func isIdentifier
JSONParser.swift:121 if expect(target) {JSONParser.swift:166 if !expect("\"") {JSONParser.swift:209 let sign = expect("-") ? -1.0 : 1.0JSONParser.swift:241 if expect(".") {JSONParser.swift:267 if expect("e") || expect("E") {JSONParser.swift:267 if expect("e") || expect("E") {JSONParser.swift:270 if expect("-") {JSONParser.swift:272 } else if expect("+") {}JSONParser.swift:307 LOOP: while cur != end && !expect("}") {JSONParser.swift:314 if !expect(":") {JSONParser.swift:327 if expect(",") {JSONParser.swift:329 } else if expect("}") {JSONParser.swift:357 LOOP: while cur != end && !expect("]") {JSONParser.swift:362 if expect(",") {JSONParser.swift:364 } else if expect("]") {(char: Char) -> Bool { 0416 switch char { 0417 case Char(ascii: "a") ... Char(ascii: "z"): 0418 return true 0419 default: 0420 return false 0421 } 0422 } 0423 0424 private func advance
JSONParser.swift:384 if !isIdentifier(target.utf8Start.memory) {() { 0425 assert(cur != end, "out of range") 0426 cur++ 0427 0428 if cur != end { 0429 switch currentChar { 0430 0431 case Char(ascii: "\n"): 0432 lineNumber++ 0433 columnNumber = 1 0434 0435 default: 0436 columnNumber++ 0437 } 0438 } 0439 } 0440 0441 private func skipWhitespaces
JSONParser.swift:134 advance()JSONParser.swift:140 advance()JSONParser.swift:163 advance()JSONParser.swift:187 advance()JSONParser.swift:213 case Char(ascii: "0"): advance()JSONParser.swift:221 advance()JSONParser.swift:253 advance()JSONParser.swift:284 advance()JSONParser.swift:303 advance()JSONParser.swift:352 advance()JSONParser.swift:386 advance()JSONParser.swift:408 advance()JSONParser.swift:449 advance()() { 0442 while cur != end { 0443 switch currentChar { 0444 case Char(ascii: " "), Char(ascii: "\t"), Char(ascii: "\r"), Char(ascii: "\n"): 0445 break 0446 default: 0447 return 0448 } 0449 advance() 0450 } 0451 } 0452 } 0453 0454 let unescapeMapping
JSONParser.swift:66 skipWhitespaces()JSONParser.swift:83 skipWhitespaces()JSONParser.swift:304 skipWhitespaces()JSONParser.swift:312 skipWhitespaces()JSONParser.swift:322 skipWhitespaces()JSONParser.swift:325 skipWhitespaces()JSONParser.swift:353 skipWhitespaces()JSONParser.swift:359 skipWhitespaces(): [UnicodeScalar: UnicodeScalar] = [ 0455 "t": "\t", 0456 "r": "\r", 0457 "n": "\n" 0458 ] 0459 0460 let escapeMapping
JSONParser.swift:204 return unescapeMapping[c] ?? c: [Character: String] = [ 0461 "\r": "\\r", 0462 "\n": "\\n", 0463 "\t": "\\t", 0464 "\\": "\\\\", 0465 "\"": "\\\"", 0466 0467 "\u{2028}": "\\u2028", 0468 "\u{2029}": "\\u2029", 0469 0470 "\r\n": "\\r\\n" 0471 ] 0472 0473 let hexMapping
JSONParser.swift:509 if let escapedSymbol = escapeMapping[c] {: [UnicodeScalar: UInt32] = [ 0474 "0": 0x0, 0475 "1": 0x1, 0476 "2": 0x2, 0477 "3": 0x3, 0478 "4": 0x4, 0479 "5": 0x5, 0480 "6": 0x6, 0481 "7": 0x7, 0482 "8": 0x8, 0483 "9": 0x9, 0484 "a": 0xA, "A": 0xA, 0485 "b": 0xB, "B": 0xB, 0486 "c": 0xC, "C": 0xC, 0487 "d": 0xD, "D": 0xD, 0488 "e": 0xE, "E": 0xE, 0489 "f": 0xF, "F": 0xF 0490 ] 0491 0492 let digitMapping
JSONParser.swift:526 return hexMapping[UnicodeScalar(byte)]: [UnicodeScalar:Int] = [ 0493 "0": 0, 0494 "1": 1, 0495 "2": 2, 0496 "3": 3, 0497 "4": 4, 0498 "5": 5, 0499 "6": 6, 0500 "7": 7, 0501 "8": 8, 0502 "9": 9 0503 ] 0504 0505 public func escapeAsJSONString
JSONParser.swift:522 return digitMapping[UnicodeScalar(byte)](source : String) -> String { 0506 var s = "\"" 0507 0508 for c in source.characters { 0509 if let escapedSymbol = escapeMapping[c] { 0510 s.appendContentsOf(escapedSymbol) 0511 } else { 0512 s.append(c) 0513 } 0514 } 0515 0516 s.appendContentsOf("\"") 0517 0518 return s 0519 } 0520 0521 func digitToInt
JSONSerializer.swift:39 case .StringValue(let s): return escapeAsJSONString(s)JSONSerializer.swift:72 s += "\(escapeAsJSONString(entry.0)):\(entry.1.serialize(self))"JSONSerializer.swift:114 s += "\(escapeAsJSONString(key)): \(o[key]!.serialize(self))"(byte: UInt8) -> Int? { 0522 return digitMapping[UnicodeScalar(byte)] 0523 } 0524 0525 func hexToDigit
JSONParser.swift:216 if let value = digitToInt(currentChar) {JSONParser.swift:246 if let value = digitToInt(currentChar) {JSONParser.swift:278 if let value = digitToInt(currentChar) {(byte: UInt8) -> UInt32? { 0526 return hexMapping[UnicodeScalar(byte)] 0527 }
JSONParser.swift:186 while let d = hexToDigit(nextChar) {