JSONExportでJSONからモデルのコードを生成する

# JSONExportとは

JSONExportはJSONからモデルのコードを出力してくれるMac用のアプリケーションです。

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

<img width="1168" alt="スクリーンショット 2016-04-05 11.14.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/16973/643b0065-538c-e734-f3d9-c912c5ae22a0.png">

# 出力できるもの

1. Java for Android.
2. Java for Android - to use with Realm.
3. Swift Classes.
4. Swift Classes - To use with SwiftyJSON library.
5. Swift Classes - To use with Realm.
6. Swift - CoreData.
7. Swift Sturcutres.
8. Objective-C - iOS.
9. Objective-C - MAC.
10. Objective-C - CoreData.
11. Objective-C - To use with Realm.

# できること

```
{
  "id": 123456,
  “text”: “Hello!!“,
  "user": {
    "id": 1234,
    "name": “Motokazu Sekine”
  }
}
```

たとえば、このJSONから、以下のコードが出力されます。

```swift:RootClass.swift
//
//	RootClass.swift
//	Model file Generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport

import Foundation


class RootClass : NSObject, NSCoding{

	var id : Int!
	var text : String!
	var user : User!


	/**
	 * Instantiate the instance using the passed dictionary values to set the properties values
	 */
	init(fromDictionary dictionary: NSDictionary){
		id = dictionary["id"] as? Int
		text = dictionary["text"] as? String
		if let userData = dictionary["user"] as? NSDictionary{
			user = User(fromDictionary: userData)
		}
	}

	/**
	 * 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 id != nil{
			dictionary["id"] = id
		}
		if text != nil{
			dictionary["text"] = text
		}
		if user != nil{
			dictionary["user"] = user.toDictionary()
		}
		return dictionary
	}

    /**
    * NSCoding required initializer.
    * Fills the data from the passed decoder
    */
    @objc required init(coder aDecoder: NSCoder)
	{
         id = aDecoder.decodeObjectForKey("id") as? Int
         text = aDecoder.decodeObjectForKey("text") as? String
         user = aDecoder.decodeObjectForKey("user") as? User

	}

    /**
    * NSCoding required method.
    * Encodes mode properties into the decoder
    */
    @objc func encodeWithCoder(aCoder: NSCoder)
	{
		if id != nil{
			aCoder.encodeObject(id, forKey: "id")
		}
		if text != nil{
			aCoder.encodeObject(text, forKey: "text")
		}
		if user != nil{
			aCoder.encodeObject(user, forKey: "user")
		}

	}

}
```

```swift:User.swift
//
//	User.swift
//	Model file Generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport

import Foundation


class User : NSObject, NSCoding{

	var id : Int!
	var name : String!


	/**
	 * Instantiate the instance using the passed dictionary values to set the properties values
	 */
	init(fromDictionary dictionary: NSDictionary){
		id = dictionary["id"] as? Int
		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 id != nil{
			dictionary["id"] = id
		}
		if name != nil{
			dictionary["name"] = name
		}
		return dictionary
	}

    /**
    * NSCoding required initializer.
    * Fills the data from the passed decoder
    */
    @objc required init(coder aDecoder: NSCoder)
	{
         id = aDecoder.decodeObjectForKey("id") as? Int
         name = aDecoder.decodeObjectForKey("name") as? String

	}

    /**
    * NSCoding required method.
    * Encodes mode properties into the decoder
    */
    @objc func encodeWithCoder(aCoder: NSCoder)
	{
		if id != nil{
			aCoder.encodeObject(id, forKey: "id")
		}
		if name != nil{
			aCoder.encodeObject(name, forKey: "name")
		}

	}

}
```

超絶に便利です！！

# 使い方

JSONExportはバイナリで提供されていませんので、プロジェクトをダウンロードして自分でビルドする必要があります。
ビルドには、XcodeのインストールされたMacが必要です。

https://github.com/Ahmed-Ali/JSONExport からCloneするなりダウンロードするなりして、プロジェクトをゲットしましょう。

**JSONExport.xcodeproj**をXcodeで開きます。

<img width="1512" alt="スクリーンショット 2016-04-05 11.24.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/16973/f089c8e9-ccd9-7090-3d62-47a1f31b2b99.png">

メニューから、[Product]->[Archive]を選択します

<img width="251" alt="スクリーンショット 2016-04-05 11.25.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/16973/8a5b17ac-3287-e268-b720-4d8265ef0af0.png">

ビルドが開始されます。
ビルドが終了すると、オーガナイザが開くので[Export]ボタンを押します。

<img width="315" alt="スクリーンショット 2016-04-05 11.28.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/16973/6d405e30-0106-5442-4eeb-565f30638a13.png">

「Export as a Mac Application」を選択して、[Next]ボタンを押します。

<img width="615" alt="スクリーンショット 2016-04-05 11.30.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/16973/a86bf9fa-4c5c-cdc9-22ea-6145a70605b6.png">

出力先を聞かれるので、とりあえずデスクトップを指定しましょう。

<img width="392" alt="スクリーンショット 2016-04-05 11.32.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/16973/647a15b0-b682-059b-c34b-10e61e468839.png">

<img width="233" alt="スクリーンショット 2016-04-05 11.34.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/16973/ad009726-0e07-f6a7-9aa4-30fb4727022c.png">

[Export]ボタンを押すと、JSONExportの入ったフォルダができます。

<img width="122" alt="スクリーンショット 2016-04-05 11.35.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/16973/edd364f5-8aa6-ce77-675e-ec56e0c04b0e.png">

このフォルダの中に入っているJSONExportを使うことになります。

<img width="363" alt="スクリーンショット 2016-04-05 11.35.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/16973/4899ac5e-4f19-8fce-1ac4-49bb2178e0b6.png">

あとは、JSONExportを起動して、左ペインにJSONのコードを貼り付けて、右下で出力するコードの種類を指定して、[Save]ボタンを押すだけです！

<img width="1168" alt="スクリーンショット 2016-04-05 11.42.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/16973/93471b5e-886d-1149-523f-efcfd1f25378.png">

ファイルに出力せずに、そのままコードをコピーしてもOKです。


# おしまい

JSONからコードをちまちま書いていくのはミスの元ですし、結構辛い作業です。
JSONExportを使って、楽しましょう！