私はSwift 4で新しく、JsonをSwift JavaのGsonのように自動的にオブジェクトに変換する方法を理解しようとしています。使用できるプラグインはありますか?私のjsonをオブジェクトに、またはその逆に変換できます。私はSwiftyJsonライブラリを使用しようとしましたが、jsonをオブジェクトマッパーに直接変換するための構文を理解できませんでした。Gsonの変換は次のとおりです。
String jsonInString = gson.toJson(obj);
Staff staff = gson.fromJson(jsonInString, Staff.class);
私のような初心者のために、本当に簡単な例をいくつか教えてください。以下は私のSwift人のクラスです:
class Person {
let firstName: String
let lastName: String
init(firstName: String, lastName: String) {
self.firstName = firstName
self.lastName = lastName
}
}
以下は、サーバーから応答を取得するためのメソッド呼び出しです。
let response = Helper.makeHttpCall(url: "http://localhost:8080/HttpServices/GetBasicJson", method: "PUT", param: interestingNumbers)
応答変数でjsonを取得しています:
{
"firstName": "John",
"lastName": "doe"
}
Swiftに外部ライブラリは不要になりました。Swift 4の時点で、探しているものを実現できるプロトコルが2つあります: Decodable および Encodable は、 Codableにグループ化されます typealias、および JSONDecoder .
Codable
に準拠するエンティティを作成する必要があるだけです(この例ではDecodable
で十分です)。
struct Person: Codable {
let firstName, lastName: String
}
// Assuming makeHttpCall has a callback:
Helper.makeHttpCall(url: "http://localhost:8080/HttpServices/GetBasicJson", method: "PUT", param: interestingNumbers, callback: { response in
// response is a String ? Data ?
// Assuming it's Data
let person = try! decoder.decode(Person.self, for: response)
// Uncomment if it's a String and comment the line before
// let jsonData = response.data(encoding: .utf8)!
// let person = try! decoder.decode(Person.self, for: jsonData)
print(person)
})
より詳しい情報:
@nathanが提案したように
「Swiftに外部ライブラリは必要なくなりました。」
しかし、ObjectMapper
のようなサードパーティのライブラリを使いたい場合
class Person : Mappable {
var firstName: String?
var lastName: String?
required init?(map:Map) {
}
func mapping(map:Map){
//assuming the first_name and last_name is what you have got in JSON
// e.g in Android you do like @SerializedName("first_name") to map
firstName <- map["first_name"]
lastName <- map["last_name"]
}
}
let person = Mapper<Person>().map(JSONObject:response.result.value)
@nathanの回答を拡張して@SerializedName
Codable
を使用したiOSの同等のアノテーション
struct Person : Codable {
let firstName : String?
let lastName : String?
enum CodingKeys: String, CodingKey {
case firstName = "first_name"
case lastName = "last_name"
}
}