1. 程式人生 > >JSON解析:NSData轉陣列,通過字典轉模型的具體實現

JSON解析:NSData轉陣列,通過字典轉模型的具體實現

以前看過視訊,但是視訊上更多的是直接通過JSON解析成字典,沒有NSData轉陣列這一塊,由於我自己寫的PHP,所以JSON編碼之後其實是字典陣列,需要經過陣列然後才能取出字典,最後將字典轉成模型。

具體實現很簡單,但是我找了很多資料,一方面是如何解析JSON,另一方面是檢視PHP有沒有寫對。查了很多,但是執行之後都是報錯的,無奈之下,我找出了以前看的視訊,發現我解析出來的JSON,並不是繼承自NSDictionaryM的,而是繼承自NSArrayM的,然後我就再去找資料,又經歷一番波折,總算分析清楚了。

[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        // 網路請求結束之後執行!
        if (connectionError == nil) {

      }

}

我是這樣進行非同步請求的,得到的是data,原本我是直接進行字典轉模型的,就是下面這樣的:

NSDictionary *dic = [NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingMutableContainerserror:nil];

QLDAccount *account = [QLDAccount accountWithDict:dic];


這樣寫的是用系統自帶的API :NSJSONSerialization 來解析data成字典,然後將字典轉成模型,但是一直出現問題:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM objectForKey:]: unrecognized selector sent to instance


在百度上一直找為什麼,但是都沒有答案,深感百度不給力啊,所以我只能去翻以前看過的視訊,終於找到了。

在我解析成字典之前,我需要看一下解析出來的是否是繼承字典的,所以我加了些程式碼:

id  arr = [NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingAllowFragmentserror:nil];

            NSLog(@"%@", [arr class]);

這樣就可以找到JSON解析後的型別了,結果顯示是繼承自NSArrayM的,所以就需要先轉成陣列,然後轉成字典,最後變成模型,雖然轉換聽起來比較麻煩,但是實際程式碼卻挺簡單的:

id

  arr = [NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingAllowFragmentserror:nil];

            NSLog(@"%@", [arr class]);

            if ([arr isKindOfClass:[NSArray class]]) {

                NSArray *nsArray = [QLDAccount objectArrayWithKeyValuesArray:arr];

//                NSLog(@"%@",nsArray);

//                NSLog(@"%@",[nsArray objectAtIndex:0]);

                for (QLDAccount *user in nsArray) {

                    NSLog(@"name = %@, id = %@, url = %@",user.username,user.user_id, user.pic_url);

                }

            }

這樣就成功的解析出來的,而且將資料都放到QLDAccount模型中去了,方便使用~

通過這次,我終於對JSON瞭解了一些,專案中在和資料庫互動的時候還需要用到,瞭解多了一點,到時候使用起來更方便了~