Json回転モデル1--SwityJson

6642 ワード

JSONはモバイル端末開発でよく使われるアプリケーション層データ交換プロトコルである.最も一般的なシーンは、クライアントがサービス側にネットワーク要求を開始し、サービス側がJSONテキストに戻り、クライアントがこのJSONテキストを解析し、対応するデータをページに表示することです.しかし、プログラミングの時、JSONを処理するのは面倒なことです.ホイールを導入しない場合は、JSONをDictionaryに変換し、各データに対応するKeyを覚えておき、このKeyでDictionaryから対応するValueを取り出して使用する必要があります.この過程で私たちはいろいろな間違いを犯します.
* Key    
*      
*      
*        
*                  ,            
* ...

これらの問題を解決するために、多くのJSONを処理するオープンソースライブラリが誕生した.Swiftでは、これらのオープンソースライブラリは主に2つの方向に努力しています.
1.   JSON  ,    JSON,             、   
2.    Model , JSON        ,       

1に対して、最も広く評価されているライブラリはSwityJSONではなく、この方向の核心を代表することができます.本質的にはJSON構造に基づいて値を取り、使い勝手がよく、はっきりしています.しかし、そのため、Key、パス、タイプは開発者が指定する必要があるため、このような方法は上記のいくつかの問題を適切に解決することができませんでした.
2については、個人的にはもっと合理的な方法だと思います.Modelクラスが存在するため、JSONの解析と使用は定義された制約を受けている.クライアントとサービス側がこのModelクラスを約束すれば、クライアント定義後、業務でデータを使用する際に文法検査、属性プレビュー、属性補完などのメリットを享受することができる.また、データ定義が変更されると、コンパイラは使用する場所をすべて変更してコンパイルすることを強制し、非常に安全である.この方向では、オープンソースライブラリたちがやっている仕事は、主にJSONテキストをModelクラスに逆シーケンス化することです.この種のJSONライブラリにはObjectMapper,JSOnNeverDie,HandyJSONなどがある.
今日はまずSwityJSONの使い方を見てみましょう.
通常、私たちはデータを手に入れると非常に面倒なoptinonal(オプションタイプ)でパケットを分解(Wrapping)操作を行い、SwityJson内部で自動的にoptionalを分解し、コードを大幅に簡略化し、解析が非常に便利で、手に入れたjsonデータdataを直接投げ込む.
//  JSON  
let jsonData = JSON.init(data)

必要なデータに関係なく、jsonDataをパスして読み込む.
let build_name = jsonData[0]["build_name"].stringValue

特筆すべきは、サーバが私たちに返すタイプを考慮する必要はありません.例えば、1つの家の棟数"build_num": 588を要求する必要はありません.IntタイプやStringタイプを取得したい場合は、
let room_num1 = jsonData[0]["build_num"].stringValue
let room_num2 = jsonData[0]["build_num"].intValue
// room_num1 = 588   String  
// room_num2 = 588   Int  

このように.stringValue.intValueによって選択不可能な値タイプを得ることができ、データが取得されなければデフォルト値である.stringValueが返され、""が取得され、.intValueが取得され、0が取得され、.arrayValueが空の配列[]が取得され、パケットの取り外しを判断する必要はありません.
もちろん、いくつかのシーンでは、オプションの値タイプを取得し、存在するかどうかを自分で判断する必要がある場合があります.
//String
if let build_name = jsonData[0]["build_name"].string {
    print(build_name)
} else {
    //      
    print(jsonData[0]["build_name"])
}

データの解析は本当に簡単です.詳細な使用は、SwiftyJSONの使用の詳細(サンプル付)やGitHub-SwiftyJsonへの移行を見ることができますが、プロジェクトにとってデータをモデルに変換する必要があります.dataのJSON読み取りだけでは十分ではありません.考えてみれば、多くの場所で.string .int .bool .float .array .dictionaryの値が使われていますが、サーバが返してくれたフィールドの名前を変更すると、プロジェクトを変更するときに面倒になり、変更が不完全になることもあります.だから私たちのチームのデータはカプセル化してモデルに変えて、このように修正する時ただ1つの地方がmodelの賦値であることを変えるだけでいいです.
私の方法は
//      
let baseInfo: [String : Any] = ["build_name":"  ·  ",
                                  "build_address":"              ",
                                  "build_num": 12,
                                  "room_num": 588,
                                  "area_address":"             "]

structモデルを作成するには、もちろんClassでも構いませんが、継承も複雑でない場合はstruct(-.-説明は多くありません)を推奨し、作成方法を書きます.
import SwiftyJSON

struct BuildBaseInfoModel {
    var build_name: String?
    var build_address: String?
    var build_num: String?
    var room_num: String?
    var area_address: String?
    
    init(jsonData: JSON) {
        build_name    = jsonData["build_name"].stringValue
        build_address = jsonData["build_address"].stringValue
        area_address  = jsonData["area_address"].stringValue
        room_num      = jsonData["room_num"].stringValue
        build_num     = jsonData["build_num"].stringValue
    }
}

呼び出し:
let jsonData = JSON(baseInfo)
let model = BuildBaseInfoModel.init(jsonData: jsonData)
//         BuildBaseInfoModel      model
//       
let model = BuildBaseInfoModel(jsonData: jsonData)

もちろんこれは普通のモデルで、複雑なモデルに遭遇することがよくあります.例えば、次のようなものです.
//    89 Int, 109 129 String
let baseInfo: [String : Any] = ["build_name":"  ·  ",
                                  "build_address":"              ",
                                  "area_address":"             ",
                                  "area":[89,"109","129"],
                                  "detail_address":["province":"   ",
                                                    "city":"   ",
                                                    "district":"   ",
                                                    "street":"    "],
                                  "build_num": 12,
                                  "room_num": 588]

モデルは2つあるはずです
struct BuildBaseInfoModel {
    
    var build_name: String?
    var build_address: String?
    var build_num: String?
    var room_num: String?
    var area_address: String?
    var detail_address: DetailAddressModel
    var area:[Any]?
    //     area      arrayValue   ,  arrayValue    JSON  ,             
    init(jsonData: JSON) {
        build_name    = jsonData["build_name"].stringValue
        build_address = jsonData["build_address"].stringValue
        area_address  = jsonData["area_address"].stringValue
        room_num      = jsonData["room_num"].stringValue
        build_num     = jsonData["build_num"].stringValue
        area          = jsonData["area"].arrayObject
        detail_address = DetailAddressModel(jsonData: jsonData["detail_address"])
    }
}
struct DetailAddressModel {
    var province: String?
    var city: String?
    var district: String?
    var street: String?
    
    init(jsonData: JSON) {
        province = jsonData["province"].stringValue
        city = jsonData["city"].stringValue
        district = jsonData["district"].stringValue
        street = jsonData["street"].stringValue
    }
    
}
let model = BuildBaseInfoModel(jsonData: jsonData)
DPrint(message: model.detail_address.city)
DPrint(message: model.area?.first)
DPrint(message: model.area?[1])
// xxxxxxxxx.swift[21], updateRoomsData(index:): Optional("   ")
// xxxxxxxxx.swift[22], updateRoomsData(index:): Optional(89)
// xxxxxxxxx.swift[22], updateRoomsData(index:): Optional("109")

はい、完成しました.Jsonデータの解析はとても便利ですが、モデルを作成するときは、少し煩雑です.とにかく目的は達成した