Json回転モデル1--SwityJson
6642 ワード
JSONはモバイル端末開発でよく使われるアプリケーション層データ交換プロトコルである.最も一般的なシーンは、クライアントがサービス側にネットワーク要求を開始し、サービス側がJSONテキストに戻り、クライアントがこのJSONテキストを解析し、対応するデータをページに表示することです.しかし、プログラミングの時、JSONを処理するのは面倒なことです.ホイールを導入しない場合は、JSONをDictionaryに変換し、各データに対応するKeyを覚えておき、このKeyでDictionaryから対応するValueを取り出して使用する必要があります.この過程で私たちはいろいろな間違いを犯します.
これらの問題を解決するために、多くのJSONを処理するオープンソースライブラリが誕生した.Swiftでは、これらのオープンソースライブラリは主に2つの方向に努力しています.
1に対して、最も広く評価されているライブラリはSwityJSONではなく、この方向の核心を代表することができます.本質的にはJSON構造に基づいて値を取り、使い勝手がよく、はっきりしています.しかし、そのため、Key、パス、タイプは開発者が指定する必要があるため、このような方法は上記のいくつかの問題を適切に解決することができませんでした.
2については、個人的にはもっと合理的な方法だと思います.Modelクラスが存在するため、JSONの解析と使用は定義された制約を受けている.クライアントとサービス側がこのModelクラスを約束すれば、クライアント定義後、業務でデータを使用する際に文法検査、属性プレビュー、属性補完などのメリットを享受することができる.また、データ定義が変更されると、コンパイラは使用する場所をすべて変更してコンパイルすることを強制し、非常に安全である.この方向では、オープンソースライブラリたちがやっている仕事は、主にJSONテキストをModelクラスに逆シーケンス化することです.この種のJSONライブラリにはObjectMapper,JSOnNeverDie,HandyJSONなどがある.
今日はまずSwityJSONの使い方を見てみましょう.
通常、私たちはデータを手に入れると非常に面倒なoptinonal(オプションタイプ)でパケットを分解(Wrapping)操作を行い、SwityJson内部で自動的にoptionalを分解し、コードを大幅に簡略化し、解析が非常に便利で、手に入れたjsonデータdataを直接投げ込む.
必要なデータに関係なく、
特筆すべきは、サーバが私たちに返すタイプを考慮する必要はありません.例えば、1つの家の棟数
このように
もちろん、いくつかのシーンでは、オプションの値タイプを取得し、存在するかどうかを自分で判断する必要がある場合があります.
データの解析は本当に簡単です.詳細な使用は、SwiftyJSONの使用の詳細(サンプル付)やGitHub-SwiftyJsonへの移行を見ることができますが、プロジェクトにとってデータをモデルに変換する必要があります.dataのJSON読み取りだけでは十分ではありません.考えてみれば、多くの場所で
私の方法は
structモデルを作成するには、もちろんClassでも構いませんが、継承も複雑でない場合はstruct(-.-説明は多くありません)を推奨し、作成方法を書きます.
呼び出し:
もちろんこれは普通のモデルで、複雑なモデルに遭遇することがよくあります.例えば、次のようなものです.
モデルは2つあるはずです
はい、完成しました.Jsonデータの解析はとても便利ですが、モデルを作成するときは、少し煩雑です.とにかく目的は達成した
* 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データの解析はとても便利ですが、モデルを作成するときは、少し煩雑です.とにかく目的は達成した