Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.52 KB | None | 0 0
  1. import Foundation
  2.  
  3. let jsonData = """
  4.  
  5. {
  6. "name": "Kazi Abdullah Al Mamun",
  7. "id": 1,
  8. "user_name": "nightwalker",
  9. "address": {
  10. "street": "my street address",
  11. "apt_suite": "my apartment and suite",
  12. "city": "Dhaka",
  13. "country": "Bangladesh"
  14. }
  15. }
  16.  
  17. """.data(using: .utf8)!
  18.  
  19. struct User: Codable {
  20.  
  21. //Mark: - Non nested properties
  22. let name: String
  23. let id: Int
  24. let userName: String
  25.  
  26. //Mark: - Nested objects properties
  27. let street: String
  28. let aptSuite: String
  29. let city: String
  30. let country: String
  31.  
  32. //Mark: - Self object keys
  33. private enum UserKeys: String, CodingKey {
  34. case name
  35. case id
  36. case userName = "user_name"
  37.  
  38. //Key for nested object
  39. case address
  40. }
  41.  
  42. //Mark: - Nested Object Address's keys
  43. private enum AddressKeys: String, CodingKey {
  44. case street
  45. case aptSuite = "apt_suite"
  46. case city
  47. case country
  48. }
  49.  
  50. init(from decoder: Decoder) throws {
  51.  
  52. let selfContainer = try decoder.container(keyedBy: UserKeys.self)
  53. self.name = try selfContainer.decode(String.self, forKey: .name)
  54. self.id = try selfContainer.decode(Int.self, forKey: .id)
  55. self.userName = try selfContainer.decode(String.self, forKey: .userName)
  56.  
  57. //Address objects Container from selfContainer
  58. let addressContainer = try selfContainer.nestedContainer(keyedBy: AddressKeys.self, forKey: .address)
  59. self.street = try addressContainer.decode(String.self, forKey: .street)
  60. self.aptSuite = try addressContainer.decode(String.self, forKey: .aptSuite)
  61. self.city = try addressContainer.decode(String.self, forKey: .city)
  62. self.country = try addressContainer.decode(String.self, forKey: .country)
  63. }
  64. }
  65.  
  66. print("No encoder applied yet..........")
  67. if let user = try? JSONDecoder().decode(User.self, from: jsonData) {
  68. print("Decoded \(user)")
  69. if let encodedUser = try? JSONEncoder().encode(user) {
  70. print("Encoded User: \(String(data: encodedUser, encoding: .utf8)!)")
  71. /**
  72. From output we can see that Encoded User Json is not same as Json from which we decoded User.
  73. If we want to make nested Json from flat model we need to write our own encoder.
  74. */
  75. }
  76. }
  77. print(".................................\n\n")
  78.  
  79. extension User {
  80.  
  81. // In playground it may show error "Invalid redeclaration of 'encode(to:)'"
  82. // Overlook and run.
  83. func encode(to encoder: Encoder) throws {
  84.  
  85. var userContainer = encoder.container(keyedBy: UserKeys.self)
  86. try userContainer.encode(self.name, forKey: .name)
  87. try userContainer.encode(self.id, forKey: .id)
  88. try userContainer.encode(self.userName, forKey: .userName)
  89.  
  90. var addressContainer = userContainer.nestedContainer(keyedBy: AddressKeys.self, forKey: .address)
  91. try addressContainer.encode(self.street, forKey: .street)
  92. try addressContainer.encode(self.aptSuite, forKey: .aptSuite)
  93. try addressContainer.encode(self.city, forKey: .city)
  94. try addressContainer.encode(self.country, forKey: .country)
  95. }
  96. }
  97.  
  98.  
  99. print("Encoder applied..........")
  100. if let user = try? JSONDecoder().decode(User.self, from: jsonData) {
  101. print("Decoded \(user)")
  102. if let encodedUser = try? JSONEncoder().encode(user) {
  103. print("Encoded User: \(String(data: encodedUser, encoding: .utf8)!)")
  104. /**
  105. From output we can see that Encoded User Json and Json from which we decoded User is same :).
  106. */
  107. }
  108. }
  109. print("..........................")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement