-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathJsonParser+Foundation.swift
More file actions
78 lines (71 loc) · 2.14 KB
/
JsonParser+Foundation.swift
File metadata and controls
78 lines (71 loc) · 2.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//
// JsonSerializer+Foundation.swift
// JsonSerializer
//
// Created by Fuji Goro on 2014/09/15.
// Copyright (c) 2014 Fuji Goro. All rights reserved.
//
import Foundation
public extension Json {
var anyValue: AnyObject {
switch self {
case .object(let ob):
var mapped: [String : AnyObject] = [:]
ob.forEach { key, val in
mapped[key] = val.anyValue
}
return mapped
case .array(let array):
return array.map { $0.anyValue }
case .bool(let bool):
return bool
case .number(let number):
return number
case .string(let string):
return string
case .null:
return NSNull()
}
}
var foundationDictionary: [String : AnyObject]? {
return anyValue as? [String : AnyObject]
}
var foundationArray: [AnyObject]? {
return anyValue as? [AnyObject]
}
}
extension Json {
public static func from(_ any: AnyObject) -> Json {
switch any {
// If we're coming from foundation, it will be an `NSNumber`.
//This represents double, integer, and boolean.
case let number as Double:
return .number(number)
case let string as String:
return .string(string)
case let object as [String : AnyObject]:
return from(object)
case let array as [AnyObject]:
return .array(array.map(from))
case _ as NSNull:
return .null
default:
fatalError("Unsupported foundation type")
}
return .null
}
public static func from(_ any: [String : AnyObject]) -> Json {
var mutable: [String : Json] = [:]
any.forEach { key, val in
mutable[key] = .from(val)
}
return .from(mutable)
}
}
extension Json {
public static func deserialize(_ data: NSData) throws -> Json {
let startPointer = UnsafePointer<UInt8>(data.bytes)
let bufferPointer = UnsafeBufferPointer(start: startPointer, count: data.length)
return try deserialize(bufferPointer)
}
}