如何在 Swift 中优雅地处理 JSON

如何在 Swift 中优雅地处理 JSON,第1张

enum JSONValue { case JNumber(NSNumber) case JString(String) case JBool(Bool) case JNull case JArray(Array<JSONValue>) case JObject(Dictionary<String,JSONValue>) case JInvalid(NSError) } 你可以使用一个switch子句去更有效地获取值: let json = JSONValue(jsonObject) switch json["user_id"]{ case .JString(let stringValue): let id = stringValue.toInt() case .JNumber(let numberValue): let id = numberValue.integerValue default: println("ooops!!! JSON Data is Unexpected or Broken")

for(int j = 0j <heightj++)

{

QRgb* line = (QRgb*) image.scanLine(j)

const uchar * r = channel_R.constScanLine(j)

const uchar * g = channel_G.constScanLine(j)

const uchar * b = channel_B.constScanLine(j)

for(int i = 0i <widthi++)

{

line[i] = qRgb(r[i], g[i], b[i])

}

在OC下面字典和模型的转换有些非常好用的第三方框架,如(YYMode, MJExtension等),当然Swift也可以借鉴这两个框架,只是需要创建模型的时候继承自NSObject,并且加上关键字@objcMembers既可。

1、在用原生Codable协议的时候,需要当前类继承协议Codable,只是swift的枚举、结构体和类都可以继承该协议。这点事OC无法做到的。

2、在使用Codable协议的时候,一定要确保模型和原始json数据之间的key值的一致性。

列入有一段json字典如下(这里我用的字典)

那么你的模型就需要如下实现(当然这是理想状态)

3、如果你的模型里面有一个字段如(name_op)并且原始json数据里面没有该值,此时你的模型如果如下。

那么你解析成模型的时候会失败,此时需要把不确定的值定义为可选类型。那么不管原始json数据有没有这个字段,都可以解析成功,如果没有,那么该属性为nil。

4、如果你的模型已经设计好了,但是原始json数据里面有个字段和你的字段事冲突的(如你的属性叫 nick 而原始数据为 nick_name ),那么该值是解析不成功的,如果是可选还好,至少能成功,否则就失败。

解决的办法是实现 enum CodingKeys: String, CodingKey {}这个映射关系

5、如果你的模型里面带有嵌套关系,比如你的模型里面有个其他模型或者模型数组,那么只要保证嵌套的模型里面依然实现了对应的协议,和当前模型一样即可。

6、如果模型里面和原始数据里面的类型不统一,那么这个解析也会以失败告终。而这种情况需要自定义一个类去适配当前属性。最常见的有(Bool和Int,Int和String)这些在后台若类型语言上是不加区分的。所以不确定到底是什么类型,如果随意定义一个那么会失败。

如下:定义了一个可能是Bool或者Int的类型

下面是一个Int 或者String类型的

在设计模型的时候,如下赋值

若是完成上面几步,基本可以解决字典模型转换的巨大部分问题。贴上我设计的模型。

以及创建的字典

使用


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9938792.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存