・トップレベルオブジェクトは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")]