88
99import Foundation
1010
11+ @dynamicMemberLookup
1112public enum JSONElement : Codable {
1213
1314 case null
@@ -148,8 +149,17 @@ public enum JSONElement: Codable {
148149 let data = try JSONEncoder ( ) . encode ( self )
149150 return try JSONDecoder ( ) . decode ( T . self, from: data)
150151 }
152+
153+ public subscript( dynamicMember member: String ) -> JSONElement {
154+ if case . object( let value) = self {
155+ return value [ member] ?? . null
156+ }
157+ return . null
158+ }
151159}
152160
161+
162+ @dynamicMemberLookup
153163public struct JSONMapper {
154164
155165 private var originData : Any ?
@@ -175,11 +185,19 @@ public struct JSONMapper {
175185 self . originData = obj
176186 }
177187
178- public init ( data: Any ? ) {
179- self . originData = data
188+ public init ( data: Data ) {
189+ guard let obj = try ? JSONSerialization . jsonObject ( with: data, options: . allowFragments) else {
190+ self . originData = nil
191+ return
192+ }
193+ self . originData = obj
194+ }
195+
196+ public init ( raw: Any ? ) {
197+ self . originData = raw
180198 }
181199
182- public func value< T> ( ) -> T ? {
200+ public func value< T> ( type : T . Type = T . self ) -> T ? {
183201 return originData as? T
184202 }
185203
@@ -194,15 +212,21 @@ public struct JSONMapper {
194212
195213
196214 public subscript( key: String ) -> JSONMapper {
197- return JSONMapper ( data : ( originData as? [ String : Any ] ) ? [ key] )
215+ return JSONMapper ( raw : ( originData as? [ String : Any ] ) ? [ key] )
198216 }
199217
200218 public subscript( index: Int ) -> JSONMapper {
201219 guard let array = originData as? [ Any ] ,
202220 index < array. count else {
203- return JSONMapper ( data : nil )
221+ return JSONMapper ( raw : nil )
204222 }
205- return JSONMapper ( data: array [ index] )
223+ return JSONMapper ( raw: array [ index] )
224+ }
225+
226+ public subscript( dynamicMember member: String ) -> JSONMapper {
227+ guard let v = self . originData,
228+ let dict = v as? [ String : Any ] else { return JSONMapper ( raw: nil ) }
229+ return JSONMapper ( raw: dict [ member] )
206230 }
207231
208232}
0 commit comments