Skip to content

Instantly share code, notes, and snippets.

@KentarouKanno
Last active August 23, 2016 16:49
Show Gist options
  • Save KentarouKanno/a4435f18169899b97018541e28f205c3 to your computer and use it in GitHub Desktop.
Save KentarouKanno/a4435f18169899b97018541e28f205c3 to your computer and use it in GitHub Desktop.
NSJSONSerialization

NSJSONSerialization

NSJSONSerialization

・トップレベルオブジェクトはNSArrayかNSDictionaryである
・全てのオブジェクトは, NSString, NSNumber, NSArray, NSDictionary, NSNull いずれかのインスタンスである
・全ての辞書のキーはNSString
・数値はNaNや無限でない

★ NSData → JSON

guard
    let url = NSBundle.mainBundle().URLForResource("Data", withExtension: "json"),
    let data = NSData(contentsOfURL: url) else { return }

do {
    // NSData → NSDictionary or NSArray
    let jsonArray = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) as! NSArray
    let jsonDict  = jsonArray[0] as! NSDictionary
    let array     = jsonDict["detail"] as! NSArray
    let dict      = array[0] as! NSDictionary
    let str       = dict["name"] as! String
    print(str)
} catch  let error as NSError {
    // エラー処理
    print("Failed: \(error.localizedDescription)")
}

Data.json

[
	{
	    "title":"Section Title",
	    "detail": [
	    	{
	    		"name": "Detail Name"
	    	}
	    ]
	}
]

★ NSJSONReadingOptions

MutableContainers
/*
これを指定すると、NSArrayやNSDictionaryの代わりに、
可変オブジェクトであるNSMutableArrayやNSMutableDictionaryを返してくれます。
*/

MutableLeaves
/*
JSONデータの葉にあたる末端のオブジェクトを可変オブジェクトとして返してくれます。
すなわちNSStringがNSMutableStringとして返ってきます。
*/

AllowFragments
/*
直訳すると「断片化を許容する」になりますが、いまいち意味を掴みにくかったです。
単純に言うと、JSONのルートがobjectやarrayではなかったとしても(数値、真偽値、文字列)、オブジェクトを返してくれるオプションです。
このオプションを指定していないと、ルートがobject,array以外の場合はnilが返ります。
*/

// 以下の様に複数しても可能
NSJSONSerialization.JSONObjectWithData(data, options: [.MutableContainers, .AllowFragments])

★ JSON → NSData

do {
    // JSON(NSDictionary or NSArray) → NSData
    let data = try NSJSONSerialization.dataWithJSONObject(json, options: .PrettyPrinted)
    print(NSString(data: data, encoding: NSUTF8StringEncoding))
} catch  let error as NSError {
    // エラー処理
    print("Failed: \(error.localizedDescription)")
}

★ JSON 文字列 → Encoding → NSData → Parse → Struct,Class

struct Sample {
    var id  : String = ""
    var name: String = ""
}

let s = "[{\"ID\":\"1\",\"Name\":\"\\u5fdc\\u7528\\u6570\\u5b66\"},{\"ID\":\"2\",\"Name\":\"\\u78ba\\u7387\\u7d71\\u8a08\"},{\"ID\":\"3\",\"Name\":\"\\u5fdc\\u7528\\u7269\\u7406II\"},{\"ID\":\"4\",\"Name\":\"\\u96fb\\u78c1\\u6c17\\u5b66\"},{\"ID\":\"5\",\"Name\":\"\\u60c5\\u5831\\u5de5\\u5b66\\u30bb\\u30df\\u30ca\\u30fc\"},{\"ID\":\"6\",\"Name\":\"\\u6570\\u5024\\u89e3\\u6790\"},{\"ID\":\"7\",\"Name\":\"\\u901a\\u4fe1\\u7406\\u8ad6\"},{\"ID\":\"8\",\"Name\":\"\\u60c5\\u5831\\u69cb\\u9020\\u8ad6\"},{\"ID\":\"9\",\"Name\":\"\\uff7c\\uff7d\\uff83\\uff91\\uff8c\\uff9f\\uff9b\\uff78\\uff9e\\uff97\\uff90\\uff9d\\uff78\\uff9e\"},{\"ID\":\"10\",\"Name\":\"\\u60c5\\u5831\\u30b7\\u30b9\\u30c6\\u30e0I\"},{\"ID\":\"11\",\"Name\":\"\\u901a\\u4fe1\\u30b7\\u30b9\\u30c6\\u30e0I\"},{\"ID\":\"12\",\"Name\":\"\\u77e5\\u8b58\\u5de5\\u5b66I\"},{\"ID\":\"13\",\"Name\":\"\\u30b3\\u30f3\\u30d4\\u30e5\\u30fc\\u30bf\\u30cd\\u30c3\\u30c8\\u30ef\\u30fc\\u30afI\"},{\"ID\":\"14\",\"Name\":\"\\u4fdd\\u5065\\u4f53\\u80b2IV\"},{\"ID\":\"15\",\"Name\":\"\\u6587\\u5b66\\u7279\\u8ad6\"},{\"ID\":\"16\",\"Name\":\"\\u6570\\u5b66\\u6982\\u8ad6I\"},{\"ID\":\"17\",\"Name\":\"\\u6570\\u5b66\\u6982\\u8ad6II\"},{\"ID\":\"18\",\"Name\":\"\\u82f1\\u8a9e\\u7279\\u8ad6I\"},{\"ID\":\"19\",\"Name\":\"\\u4e2d\\u56fd\\u8a9eI\"},{\"ID\":\"20\",\"Name\":\"\\u60c5\\u5831\\u5de5\\u5b66\\u5b9f\\u9a13I\"}]\n"

var resultArray: [Sample] = []

if let data = s.dataUsingEncoding(NSUTF8StringEncoding) {
    do {
        print(data.length)
        typealias jsonType = Array<Dictionary<String, String>>
        let JSONObject = try NSJSONSerialization.JSONObjectWithData(data, options: []) as! jsonType
        JSONObject.dynamicType
        
        for item in JSONObject {
            item["ID"]
            resultArray.append(Sample(id: item["ID"]!, name: item["Name"]!))
        }
    } catch let error {
        print(error)
    }
    
} else {
    print("Invalid string")
}

resultArray
//=> [Sample(id: "1", name: "応用数学"), Sample(id: "2", name: "確率統計"), Sample(id: "3", name: "応用物理II"), Sample(id: "4", name: "電磁気学"), Sample(id: "5", name: "情報工学セミナー"), Sample(id: "6", name: "数値解析"), Sample(id: "7", name: "通信理論"), Sample(id: "8", name: "情報構造論"), Sample(id: "9", name: "システムプログラミング"), Sample(id: "10", name: "情報システムI"), Sample(id: "11", name: "通信システムI"), Sample(id: "12", name: "知識工学I"), Sample(id: "13", name: "コンピュータネットワークI"), Sample(id: "14", name: "保健体育IV"), Sample(id: "15", name: "文学特論"), Sample(id: "16", name: "数学概論I"), Sample(id: "17", name: "数学概論II"), Sample(id: "18", name: "英語特論I"), Sample(id: "19", name: "中国語I"), Sample(id: "20", name: "情報工学実験I")]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment