-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathDynamicJson.swift
More file actions
executable file
·140 lines (114 loc) · 3.17 KB
/
Copy pathDynamicJson.swift
File metadata and controls
executable file
·140 lines (114 loc) · 3.17 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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#if false
//
// DynamicJson.swift
// ServiceStackClient
//
// Created by Demis Bellot on 1/29/15.
// Copyright (c) 2015 ServiceStack LLC. All rights reserved.
//
import Foundation
import PromiseKit
//Reflection based JSON Serializer
public class DynamicJArray
{
var sb : String
init(string : String? = nil) {
sb = string ?? String()
}
func append(value:Any) {
append(value, mirrorType:reflect(value))
}
func append(value:Any, mirrorType mi:MirrorType) {
if countElements(sb) > 0 {
sb += ","
}
var str:String = "null"
if let val = DynamicJValue.unwrap(value) {
str = DynamicJValue.toJson(val)
}
sb += "\(str)"
}
func toJson() -> String {
return "[\(sb)]"
}
class func toJson(any:Any) -> String {
return toJson(any, mirrorType: reflect(any))
}
class func toJson(any:Any, mirrorType mi:MirrorType) -> String {
var jb = DynamicJArray()
for i in 0..<mi.count {
let (name,pi) = mi[i]
jb.append(pi.value, mirrorType:pi)
}
return jb.toJson()
}
}
public class DynamicJObject
{
var sb : String
init(string : String? = nil) {
sb = string ?? String()
}
func append(name: String, value: Any) {
if name == "super" { return }
var str:String = "null"
if let val = DynamicJValue.unwrap(value) {
str = DynamicJValue.toJson(val)
}
if countElements(sb) > 0 {
sb += ","
}
sb += "\"\(name)\":\(str)"
}
class func toJson(value:Any) -> String {
return toJson(value, mirrorType:reflect(value))
}
class func toJson(value:Any, mirrorType mi:MirrorType) -> String {
var jb = DynamicJObject()
for i in 0 ..< mi.count {
let (name, pi) = mi[i]
jb.append(name, value: pi.value)
}
return jb.toJson()
}
func toJson() -> String {
return "{\(sb)}"
}
}
public class DynamicJValue
{
class func unwrap(any:Any) -> Any? {
let mi:MirrorType = reflect(any)
if mi.disposition != .Optional {
return any
}
if mi.count == 0 { return nil } // Optional.None
let (name,some) = mi[0]
return some.value
}
class func toJson(any:Any) -> String {
return toJson(any, mirrorType:reflect(any))
}
class func toJson(any:Any, mirrorType mi:MirrorType) -> String {
switch any {
case let int as Int:
return "\(int)"
case let double as Double:
return "\(double)"
case let bool as Bool:
return "\(bool)"
case let str as String:
return "\"\(str)\""
default:
switch mi.disposition {
case .IndexContainer:
return DynamicJArray.toJson(any, mirrorType:mi)
case .Class:
return DynamicJObject.toJson(any, mirrorType:mi)
default:
return "\(any)"
}
}
}
}
#endif