web-dev-qa-db-ja.com

Swift 4-JsonをSwiftに変換する方法java

私は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"
}
12
user6457240

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)
})

より詳しい情報:

18
nathan

@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の回答を拡張して@SerializedNameCodableを使用したiOSの同等のアノテーション

struct Person : Codable {

        let firstName : String?
        let lastName : String?

        enum CodingKeys: String, CodingKey {
                case firstName = "first_name"
                case lastName = "last_name"
        }

}
0
Faisal Naseer