@@ -19,6 +19,7 @@ extension Array: ModelPropertyKey where Element == String {}
1919public typealias JSONPropertyKey = String
2020
2121/// all the models who want to convert should conform to `Convertible`
22+ /// please let struct or class conform to `Convertible`
2223public protocol Convertible {
2324 init ( )
2425
@@ -89,7 +90,7 @@ public protocol Convertible {
8990 ///
9091 /// - Parameters:
9192 /// - json: A json did be converted from model
92- func kj_didConvertToJSON( json: [ String : Any ] ? )
93+ func kj_didConvertToJSON( json: [ String : Any ] )
9394}
9495
9596/// default implementation
@@ -114,7 +115,7 @@ public extension Convertible {
114115 return ConvertibleConfig . JSONValue ( from: modelValue, property, Self . self)
115116 }
116117 func kj_willConvertToJSON( ) { }
117- func kj_didConvertToJSON( json: [ String : Any ] ? ) { }
118+ func kj_didConvertToJSON( json: [ String : Any ] ) { }
118119}
119120
120121// MARK: - Wrapper for Convertible
@@ -141,22 +142,22 @@ public struct ConvertibleKJ_M<T: Convertible> {
141142 self . basePtr = basePtr
142143 }
143144
144- /// JSONObject -> Model
145+ /// JSONData -> Model
145146 public func convert( from jsonData: Data ) {
146147 basePtr. pointee. kj_convert ( from: jsonData)
147148 }
148149
149- /// JSONObject -> Model
150+ /// JSONData -> Model
150151 public func convert( from jsonData: NSData ) {
151152 basePtr. pointee. kj_convert ( from: jsonData as Data )
152153 }
153154
154- /// JSONObject -> Model
155+ /// JSONString -> Model
155156 public func convert( from jsonString: String ) {
156157 basePtr. pointee. kj_convert ( from: jsonString)
157158 }
158159
159- /// JSONObject -> Model
160+ /// JSONString -> Model
160161 public func convert( from jsonString: NSString ) {
161162 basePtr. pointee. kj_convert ( from: jsonString as String )
162163 }
@@ -179,12 +180,12 @@ public struct ConvertibleKJ<T: Convertible> {
179180 }
180181
181182 /// Model -> JSONObject
182- public func JSONObject( ) -> [ String : Any ] ? {
183+ public func JSONObject( ) -> [ String : Any ] {
183184 return base. kj_JSONObject ( )
184185 }
185186
186187 /// Model -> JSONString
187- public func JSONString( prettyPrinted: Bool = false ) -> String ? {
188+ public func JSONString( prettyPrinted: Bool = false ) -> String {
188189 return base. kj_JSONString ( prettyPrinted: prettyPrinted)
189190 }
190191}
@@ -271,22 +272,24 @@ extension Convertible {
271272
272273 private mutating
273274 func _modelTypeValue( _ jsonValue: Any ,
274- _ modelType: Any . Type ,
275+ _ modelType: Convertible . Type ,
275276 _ propertyType: Any . Type ) -> Any ? {
276277 // don't use `propertyType is XX.Type`
277278 // because it may be an `Any` type
278- if let json = jsonValue as? [ Any ] ,
279- let models = json. kj. modelArray ( anyType: modelType) {
280- return propertyType is NSMutableArray . Type
281- ? NSMutableArray ( array: models)
282- : models
279+ if let json = jsonValue as? [ Any ] {
280+ let models = json. kj. modelArray ( type: modelType)
281+ if !models. isEmpty {
282+ return propertyType is NSMutableArray . Type
283+ ? NSMutableArray ( array: models)
284+ : models
285+ }
283286 }
284287
285288 if let json = jsonValue as? [ String : Any ] {
286289 if let jsonDict = jsonValue as? [ String : [ String : Any ] ? ] {
287290 var modelDict = [ String: Any] ( )
288291 for (k, v) in jsonDict {
289- guard let m = v? . kj. model ( anyType : modelType) else { continue }
292+ guard let m = v? . kj. model ( type : modelType) else { continue }
290293 modelDict [ k] = m
291294 }
292295 guard modelDict. count > 0 else { return jsonValue }
@@ -295,7 +298,7 @@ extension Convertible {
295298 ? NSMutableDictionary ( dictionary: modelDict)
296299 : modelDict
297300 } else {
298- return json. kj. model ( anyType : modelType)
301+ return json. kj. model ( type : modelType)
299302 }
300303 }
301304 return jsonValue
@@ -304,14 +307,15 @@ extension Convertible {
304307
305308// MARK: - Model -> JSON
306309extension Convertible {
307- func kj_JSONObject( ) -> [ String : Any ] ? {
310+ func kj_JSONObject( ) -> [ String : Any ] {
311+ var json = [ String: Any] ( )
308312 guard let mt = Metadata . type ( self ) as? ModelType else {
309313 Logger . warnning ( " Not a class or struct instance. " )
310- return nil
314+ return json
311315 }
312316 guard let properties = mt. properties else {
313317 Logger . warnning ( " Don't have any property. " )
314- return nil
318+ return json
315319 }
316320
317321 kj_willConvertToJSON ( )
@@ -324,7 +328,6 @@ extension Convertible {
324328 let ptr = model. _ptr ( )
325329
326330 // get JSON from model
327- var json = [ String: Any] ( )
328331 for property in properties {
329332 // value filter
330333 guard let value = kj_JSONValue (
@@ -338,17 +341,17 @@ extension Convertible {
338341 kj_JSONKey ( from: property) ) ] = v
339342 }
340343
341- kj_didConvertToJSON ( json: json. isEmpty ? nil : json )
344+ kj_didConvertToJSON ( json: json)
342345
343346 return json
344347 }
345348
346- func kj_JSONString( prettyPrinted: Bool = false ) -> String ? {
349+ func kj_JSONString( prettyPrinted: Bool = false ) -> String {
347350 if let str = JSONSerialization . kj_string ( kj_JSONObject ( ) as Any ,
348351 prettyPrinted: prettyPrinted) {
349352 return str
350353 }
351354 Logger . error ( " Failed to get JSONString from JSON. " )
352- return nil
355+ return " "
353356 }
354357}
0 commit comments