JSONExportを使ってjsonからswiftのクラスを自動生成

モデルをたくさん作るのが面倒、そんなときに、jsonからmodelが生成できたら便利じゃないですか？
JSONExportを使うとjsonから自動でmodelが生成できます。
swiftだけでなく、objective Cやandroid用のモデルもできます。

https://github.com/Ahmed-Ali/JSONExport

![スクリーンショット 2014-12-07 21.13.26.png](https://qiita-image-store.s3.amazonaws.com/0/4585/3962102f-6fcf-cec4-fbb6-244b4f9fa6df.png)

## 実際どういうことができるか
 * 例えばこのようなjsonがあれば、以下のmodelを自動で生成できます。
 * Rootクラス名がを``Project``、Class Prefixを``WTD``とする。

```
{
  "projectID": 12,
  "title": "ガチエンジニアウォンテッド",
  "location": "東京",
  "company": {
    "companyID": 100,
    "name": "Wantedly"
  }
}
```

```
import Foundation

class WTDProject{

	var company : WTDCompany!
	var location : String!
	var projectID : Int!
	var title : String!


	/**
	 * Instantiate the instance using the passed dictionary values to set the properties values
	 */
	init(fromDictionary dictionary: NSDictionary){
		if let companyData = dictionary["company"] as? NSDictionary{
			company = WTDCompany(fromDictionary: companyData)
		}
		location = dictionary["location"] as? String
		projectID = (dictionary["projectID"] as? NSString)?.intValue
		title = dictionary["title"] as? String
	}

	/**
	 * Returns all the available property values in the form of NSDictionary object where the key is the approperiate json key and the value is the value of the corresponding property
	 */
	func toDictionary() -> NSDictionary
	{
		var dictionary = NSMutableDictionary()
		if company != nil{
			dictionary["company"] = company.toDictionary()
		}
		if location != nil{
			dictionary["location"] = location
		}
		if projectID != nil{
			dictionary["projectID"] = projectID
		}
		if title != nil{
			dictionary["title"] = title
		}
		return dictionary
	}

}
```
```
import Foundation

class WTDCompany{

	var companyID : Int!
	var name : String!


	/**
	 * Instantiate the instance using the passed dictionary values to set the properties values
	 */
	init(fromDictionary dictionary: NSDictionary){
		companyID = (dictionary["companyID"] as? NSString)?.intValue
		name = dictionary["name"] as? String
	}

	/**
	 * Returns all the available property values in the form of NSDictionary object where the key is the approperiate json key and the value is the value of the corresponding property
	 */
	func toDictionary() -> NSDictionary
	{
		var dictionary = NSMutableDictionary()
		if companyID != nil{
			dictionary["companyID"] = companyID
		}
		if name != nil{
			dictionary["name"] = name
		}
		return dictionary
	}

}
```


## 手順
* https://github.com/Ahmed-Ali/JSONExport をcloneして、xcodeで起動します。
* xcodeで起動。yosemiteにする必要あります

## 変換できる種類
* Swift - Class(上の例)
* Swift - CoreData
* Swift - Realm
* Swift - Struct
* SwiftyJSON - Class
* Java for Android
* Objective C - iOS
* Objective C - Mac
* Objective C - CoreData
* Objective C - Realm
    * Realmというのは、データ量が多い時にsqlLiteよりもパフォーマンスのよいデータベース。
    * 無料で、今年7月にHackerNewsで話題なっていて、Zyngaは2012年から使っているらしい。
    * http://qiita.com/moriyaman/items/1a2916f4c2b79e934370

## [One more thing] JSONExportを自分なりに拡張する
* JSONExportはswiftで描かれている
* デフォルトでもUnility Methodというオプションがある。これにチェックして出力すると、toDictionaryというメソッドが追加される
* JSONでそれぞれの時にどのように出力するか決まっている
* Supported LanguagesというディレクトリにSwift-Class.jsonあるり、その中のutilityMethodsに必要なメソッドを追加することができる。
* forEachPropertyが通常のプロパティで、forEachCustomTypePropertyがカスタムクラスのプロパティで、forEachArrayOfCustomTypePropertyがArrayのプロパティ。それぞれどう出力したいか書けるようになっている。

```

    "utilityMethods": [
                       {
                       "comment": "\t/**\n\t * Returns all the available property values in the form of NSDictionary object where the key is the approperiate json key and the value is the value of the corresponding property\n\t */\n",
                       "signature": "\tfunc toDictionary() -> NSDictionary",
                       "bodyStart": "\n\t{\n",
                       "bodyEnd": "\t}\n",
                       "body": "\t\tvar dictionary = NSMutableDictionary()\n",
                       "forEachProperty": "\t\tif <!VarName!> != nil{\n\t\t\tdictionary[\"<!JsonKeyName!>\"] = <!VarName!>\n\t\t}\n",
                       "forEachCustomTypeProperty" : "\t\tif <!VarName!> != nil{\n\t\t\tdictionary[\"<!JsonKeyName!>\"] = <!VarName!>.toDictionary()\n\t\t}\n",
                       "forEachArrayOfCustomTypeProperty": "\t\tif <!VarName!> != nil{\n\t\t\tvar dictionaryElements = [NSDictionary]()\n\t\t\tfor <!VarName!>Element in <!VarName!> {\n\t\t\t\tdictionaryElements.append(<!VarName!>Element.toDictionary())\n\t\t\t}\n\t\t\tdictionary[\"<!JsonKeyName!>\"] = dictionaryElements\n\t\t}\n",
                       "returnStatement": "\t\treturn dictionary\n"
                       }
                       ]
```
```

	/**
	 * Returns all the available property values in the form of NSDictionary object where the key is the approperiate json key and the value is the value of the corresponding property
	 */
	func toDictionary() -> NSDictionary
	{
		var dictionary = NSMutableDictionary()
		if companyID != nil{
			dictionary["companyID"] = companyID
		}
		if name != nil{
			dictionary["name"] = name
		}
		return dictionary
	}
```