web-dev-qa-db-ja.com

Swift-JSON応答からデータモデルを作成します

私はSwift langを学んでおり、他の人の意見を聞くのに最適なことの1つは、「JSON応答からモデルを処理する方法」です。たとえば-

私が持っています User.Swiftモデル:

class User: NSObject {
  var user_token:String?
  var email:String?
}

また、Obj-Cプロジェクトと同じように KeyValueObjectMapping を使用したいと思います。残念ながら、これはここでは機能しません。

let parser = DCKeyValueObjectMapping.mapperForClass(User)
let user = parser.parseDictionary(data.objectForKey("user") as NSDictionary) as User
println(user.user_token) // returns nil

Swiftでモデルをどのように作成しますか?

11
Kosmetika

コード生成を使用して、JSONに基づいてSwiftでモデルを生成することをお勧めします。そのために、 http://www.guideluxeでツールを作成しました。 .com/JsonToSwift を使用して、JSONのモデリングと解析を可能な限り簡単にします。

クラス名を含むサンプルJSONオブジェクトをツールに送信すると、対応するSwiftクラス、および必要な補助Swiftクラス、サンプルJSONによって暗示される構造を表します。また、NSJSONSerialization.JSONObjectWithDataメソッドを利用するものを含むSwiftオブジェクトを設定するために使用されるクラスメソッドも含まれています。NSArrayおよびNSDictionaryからの必要なマッピングオブジェクトが提供されます。

生成されたコードをSwift class(es)としてプロジェクトにコピーした後、ツールに提供されたサンプルと一致するJSONを含むNSDataオブジェクトを提供するだけで済みます。

Foundation以外に、依存関係はありません。

テストするJSONファイルからNSDataオブジェクトを作成する方法は次のとおりです。

let fileUrl: NSURL = NSBundle.mainBundle().URLForResource("JsonFile", withExtension: "json")!
let jsonData: NSData = NSData(contentsOfURL: fileUrl)!
8
Perry Tribolet

SwiftyJSONModel を使用することをお勧めします。モデルは次のようになります。

import SwiftyJSONModel

class User: NSObject, JSONObjectInitializable {
    enum PropertyKey : String {
        case user_token, email
    }

    var user_token:String?
    var email:String?

    required init(object: JSONObject<PropertyKey>) throws {
        user_token = object.value(for: .user_token)
        email = object.value(for: .email)
    }
}

このライブラリには3つの優れた点があります。

  1. ライブラリがタイプを推測するため、明示的にStringにキャストする必要はありません。
  2. オプションではないプロパティを持つことができ、ライブラリはどの正確なフィールドが間違っていたかを教えてくれます
  3. モデルのすべてのキーはenumにカプセル化されています。これにより、キーを入力したときに自動補完が行われ、列挙型にないキーにアクセスできないことが保証されます。
5
Noobass

これは、モデルクラスとライブラリなしでJSON応答を解析するためのサンプルコードです。

モデルクラス

class User: NSObject{
     var user_token: String = ""
     var email: String = ""
}

WebサービスAPIと解析を呼び出すためのサンプルコード。

NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
                var err: NSError
                var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
                //println("Result : \(jsonResult)")
                let model = User()
            model. user_token = jsonResult["user_token"] as NSString
            model. email = jsonResult["email"] as NSString
            })
2
Ajumal

私が使用しているのは jsoncafe SwiftyJSON、Codable、Gloss、Simpleなどのさまざまなフレームワークを備えた最も簡単でカスタマイズ可能なテンプレートベースモデルクラスジェネレーターSwift Classでも、独自のテンプレートを作成できます

jsoncafe.comenter image description here

1
Meghs Dhameliya

より厳密なアプローチが必要で、JSONドキュメントのメタディスクリプションとしてJSONスキーマにアクセスできる場合は、それらを処理できるコードジェネレーターを作成しました(JSONスキーマ、ドラフト4)。

https://github.com/werner77/MappableObjectGenerator

私のツールは、コード生成テンプレートに基づいているため、基本的にすべてのプログラミング言語をサポートしていますが、現在、ObjectiveCとSwift 4のサポートに重点を置いています。

0

手遅れかもしれません。

リンクhttp://www.json4Swift.com/results.phpを使用することもできます。JSON値を貼り付けるだけで、代わりにSwiftファイルが表示されます。

0
Mahesh S