基于HandyJSON实现JSON转对象,咨询数组转译静态函数实现方案
嘿,刚好我对HandyJSON的数组反序列化比较熟悉,给你一个简洁可行的实现方案,完全贴合你的需求:
实现代码
static func arrayOfObjectsFromJSONstring<T : HandyJSON>(objt : T.Type, JSONString: String, objectPath: String) -> [T?]? { // 利用HandyJSON内置的数组反序列化方法,直接指定目标路径 let deserializedArray = [T].deserialize(from: JSONString, designatedPath: objectPath) // 如果反序列化后得到空数组(说明路径不存在或JSON解析失败),返回nil;否则返回数组 return deserializedArray.isEmpty ? nil : deserializedArray }
关键细节说明
- HandyJSON已经为数组类型实现了专门的
deserialize方法,不需要我们手动拆分JSON再逐个转换,直接调用[T].deserialize(from:designatedPath:)就能搞定。 designatedPath参数完美对应你需要的objectPath,不管是单层路径(比如"data")还是嵌套路径(比如"response.result.list")都能正确识别,帮你定位到JSON中的目标数组节点。- 返回类型
[T?]?完全符合你的要求:数组里的每个元素可能因反序列化失败变成nil,如果整个路径不存在或者JSON本身无效,函数会返回nil。
可选优化(返回非空元素数组)
如果你希望过滤掉数组中反序列化失败的nil元素,返回[T]?类型,可以稍微调整代码:
static func arrayOfObjectsFromJSONstring<T : HandyJSON>(objt : T.Type, JSONString: String, objectPath: String) -> [T]? { let validObjects = [T].deserialize(from: JSONString, designatedPath: objectPath)?.compactMap { $0 } return validObjects?.isEmpty == true ? nil : validObjects }
注意事项
- 确保你的泛型类型
T严格遵循HandyJSON的规则:要么属性名和JSON字段完全一致,要么通过@JSONCodingKeys完成字段映射。 - 测试时可以覆盖几种边界情况:空JSON字符串、指定路径不存在、数组中包含无效JSON元素,验证返回结果是否符合预期。
内容的提问来源于stack exchange,提问作者Ahmad Mahmoud Saleh
相关产品推荐
相关产品推荐

