Advertisement
Guest User

Untitled

a guest
May 30th, 2015
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.76 KB | None | 0 0
  1. //
  2. // json.swift
  3. // JSON Parser
  4. //
  5. // Created by Michael Main on 4/17/15.
  6. // Copyright (c) 2015 Michael Main. All rights reserved.
  7. //
  8. // Change log
  9. // Michael Main | 04/21/2015 | Initial classes done- need to implement non string values
  10.  
  11. import Foundation
  12.  
  13. struct Stack<T> {
  14. var items = [T]()
  15. mutating func push(item: T) {
  16. items.append(item)
  17. }
  18. mutating func pop() -> T {
  19. var item : T = items.removeLast()
  20. return item
  21. }
  22. func peek() -> T {
  23. return items.last!
  24. }
  25. func isEmpty() -> Bool {
  26. return items.count == 0
  27. }
  28.  
  29. func displayStack() -> String {
  30. var s = ""
  31. var seperator = ""
  32. for item in items {
  33. s = "\(s)\(seperator)\(item)"
  34. seperator = ","
  35. }
  36.  
  37. return s
  38. }
  39. }
  40.  
  41. class JSON {
  42. enum JsonType {
  43. case NONE
  44. case OBJECT
  45. case LIST
  46. case STRING
  47. }
  48.  
  49. enum ParserState {
  50. case INIT
  51. case READING_KEY
  52. case SEARCHING_NEXT
  53. case SEARCHING_SEPERATOR
  54. case SEARCHING_VALUE
  55. case READING_STRING_VALUE
  56. case READING_INT_VALUE
  57. case READING_BOOL_VALUE
  58. case READING_OBJECT_VALUE
  59. case READING_LIST_VALUE
  60. case STORING
  61. }
  62.  
  63. class Parser {
  64. class func parseJson(jsonString : String) -> Any? {
  65. var jsonStringArray : Array<Character> = Array(jsonString)
  66. var index : Int
  67. var expression : Array<Character>
  68. var type : JsonType
  69.  
  70. (index, expression, type) = extractJsonExpression(jsonString: jsonStringArray)
  71.  
  72. if (type == JsonType.OBJECT) {
  73. return parseJsonObject(expression)
  74. } else if (type == JsonType.LIST) {
  75. return parseJsonList(expression)
  76. }
  77.  
  78.  
  79. return nil
  80. }
  81.  
  82. private class func parseJsonList(jsonString : Array<Character>) -> Array<Any> {
  83. var type : JsonType
  84. var list : Array<Any> = Array()
  85. var state : ParserState = ParserState.INIT
  86. var value : String = ""
  87. var index : Int
  88. var expression : Array<Character>
  89.  
  90. for var i = 0; i < jsonString.count; i++ {
  91. var c = jsonString[i]
  92.  
  93. switch (state) {
  94. case .INIT:
  95. if (c == "\"") {
  96. state = ParserState.READING_STRING_VALUE
  97. } else if (c == "{") {
  98. (index, expression, type) = extractJsonExpression(jsonString: jsonString, startIndex: i)
  99. i = index
  100. list.append(parseJsonObject(expression))
  101. value = ""
  102. state = ParserState.SEARCHING_NEXT
  103. } else if (c == "[") {
  104. (index, expression, type) = extractJsonExpression(jsonString: jsonString, startIndex: i)
  105. i = index
  106. list.append(parseJsonList(expression))
  107. value = ""
  108. state = ParserState.SEARCHING_NEXT
  109. }
  110. break
  111. case .READING_STRING_VALUE:
  112. if (c == "\"") {
  113. list.append(value)
  114. value = ""
  115. state = ParserState.SEARCHING_NEXT
  116. continue
  117. }
  118. value.append(c)
  119. break
  120. case .READING_INT_VALUE:
  121. break
  122. case .READING_BOOL_VALUE:
  123. break
  124. case .SEARCHING_NEXT:
  125. if (c == ",") {
  126. state = ParserState.INIT
  127. }
  128. break
  129. case .STORING:
  130. break
  131. default:
  132. break
  133. }
  134. }
  135.  
  136. return list
  137. }
  138.  
  139. private class func parseJsonObject(jsonString : Array<Character>) -> Dictionary<String, Any> {
  140. var type : JsonType
  141. var object : Dictionary<String, Any> = Dictionary()
  142. var state : ParserState = ParserState.INIT
  143. var key : String = ""
  144. var value : String = ""
  145. var index : Int
  146. var expression : Array<Character>
  147.  
  148. for var i = 0; i < jsonString.count; i++ {
  149. var c = jsonString[i]
  150.  
  151. switch (state) {
  152. case .INIT:
  153. if (c == "\"") {
  154. state = ParserState.READING_KEY
  155. }
  156. break
  157. case .READING_KEY:
  158. if (c == "\"") {
  159. state = ParserState.SEARCHING_SEPERATOR
  160. continue
  161. }
  162. key.append(c)
  163. break
  164. case .SEARCHING_SEPERATOR:
  165. if (c == ":") {
  166. state = ParserState.SEARCHING_VALUE
  167. }
  168. break
  169. case .SEARCHING_NEXT:
  170. if (c == ",") {
  171. state = ParserState.INIT
  172. }
  173. break
  174. case .SEARCHING_VALUE:
  175. if (c == "\"") {
  176. state = ParserState.READING_STRING_VALUE
  177. } else if (c == "{") {
  178. (index, expression, type) = extractJsonExpression(jsonString: jsonString, startIndex: i)
  179. i = index
  180. var obj = parseJsonObject(expression)
  181. object[key] = obj
  182. key = ""
  183. value = ""
  184. state = ParserState.SEARCHING_NEXT
  185. } else if (c == "[") {
  186. (index, expression, type) = extractJsonExpression(jsonString: jsonString, startIndex: i)
  187. i = index
  188. var list = parseJsonList(expression)
  189. object[key] = list
  190. key = ""
  191. value = ""
  192. state = ParserState.SEARCHING_NEXT
  193. }
  194. break
  195. case .READING_STRING_VALUE:
  196. if (c == "\"") {
  197. object[key] = value
  198. key = ""
  199. value = ""
  200. state = ParserState.SEARCHING_NEXT
  201. continue
  202. }
  203. value.append(c)
  204. break
  205. case .READING_INT_VALUE:
  206. break
  207. case .READING_BOOL_VALUE:
  208. break
  209. case .STORING:
  210. break
  211. default:
  212. break;
  213. }
  214. }
  215.  
  216. return object
  217. }
  218.  
  219. private class func extractJsonExpression(#jsonString : Array<Character>, startIndex index : Int = 0) -> (Int, Array<Character>, JsonType) {
  220. var typeStack = Stack<String>()
  221. var jsonSubString = Array<Character>()
  222. var objectStarted = false
  223. var type : JsonType = JsonType.NONE;
  224.  
  225. for var i = index; i < jsonString.count; i++ {
  226. var c = jsonString[i]
  227.  
  228. if (objectStarted) {
  229. jsonSubString.append(c)
  230. }
  231. //println(c)
  232.  
  233. if (c == "{") {
  234. if (!objectStarted) {
  235. type = JsonType.OBJECT
  236. }
  237. typeStack.push("{")
  238. objectStarted = true
  239. } else if (c == "}" && typeStack.peek() == "{") {
  240. typeStack.pop()
  241. } else if (c == "[") {
  242. if (!objectStarted) {
  243. type = JsonType.LIST
  244. }
  245. typeStack.push("[")
  246. objectStarted = true
  247. } else if (c == "]" && typeStack.peek() == "[") {
  248. typeStack.pop()
  249. } else if (c == "\"") {
  250. if (typeStack.peek() == "\"") {
  251. typeStack.pop()
  252. } else {
  253. if (!objectStarted) {
  254. type = JsonType.STRING
  255. }
  256. typeStack.push("\"")
  257. objectStarted = true
  258. }
  259. }
  260.  
  261. if (objectStarted && typeStack.isEmpty()) {
  262. //println("\tDONE")
  263. jsonSubString.removeLast()
  264. return (i, jsonSubString, type)
  265. }
  266. }
  267.  
  268. return (-1, Array(), JsonType.NONE)
  269. }
  270. }
  271.  
  272. class Utils {
  273. class func printJson(json: Any) {
  274. if (json is Dictionary<String, Any>) {
  275. printJsonObject(json: json as! Dictionary<String, Any>)
  276. } else if (json is Array<Any>) {
  277. printJsonList(json: json as! Array<Any>)
  278. }
  279. }
  280.  
  281. private class func printJsonObject(#json: Dictionary<String, Any>, level: Int = 0) {
  282. for (key, value) in json {
  283. tabs(level)
  284. print("\(key) => ")
  285. if (value is String) {
  286. println(value)
  287. } else if (value is Array<Any>) {
  288. println()
  289. printJsonList(json: value as! Array<Any>, level: level + 1)
  290. } else if (value is Dictionary<String, Any>) {
  291. println()
  292. printJsonObject(json: value as! Dictionary<String, Any>, level: level + 1)
  293. }
  294. }
  295. }
  296.  
  297. private class func printJsonList(#json: Array<Any>, level: Int = 0) {
  298. for (index, value) in enumerate(json) {
  299. tabs(level)
  300. print("[\(index)] => ")
  301. if (value is String) {
  302. println(value)
  303. } else if (value is Array<Any>) {
  304. println()
  305. printJsonList(json: value as! Array<Any>, level: level + 1)
  306. } else if (value is Dictionary<String, Any>) {
  307. println()
  308. printJsonObject(json: value as! Dictionary<String, Any>, level: level + 1)
  309. }
  310. }
  311. }
  312.  
  313. private class func tabs(amount: Int) {
  314. for var i = 0; i < amount; i++ {
  315. print("\t")
  316. }
  317. }
  318. }
  319. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement