Swiftにおいて、APIから取得したJSONをパースし、画面に表示しやすいように配列化しました。
その配列をprintすると、以下のように「NSSingleObjectArrayI」というものが入りました。
Swift
1["A", <__NSSingleObjectArrayI 0x604000208cc0>(12345), <__NSSingleObjectArrayI xxxxxxxxxxxxxx>(98765)]
この配列をtableViewで画面表示しようとすると、以下のエラーが出ます。
Swift
1Could not cast value of type '__NSSingleObjectArrayI' (0x10dddc328) to 'NSString' (0x10ca08d68).
「NSSingleObjectArrayI」とは何なのかをググってみたのですが、よくわかりません。
「NSSingleObjectArrayI」とは何でしょうか?
これを消して、以下のような通常(?)の配列にすることはできませんでしょうか?
的はずれな質問になっていましたら申し訳ございません。
Swift
1["A", 12345, 98765]
コメントいただいた不足点の追記です(2018/04/29)
※コードが長いので今回の相談内容とは関係なさそうな部分は削りましたが、この部分でコメントへの回答になっているか不安です。すみません。
JSONをパースした方法
Swift
1let taskReport = URLSession.shared.dataTask(with: request, completionHandler: {jsonData, response, error in 2 do { 3 let reportJsonData = try JSONSerialization.jsonObject(with: jsonData!) as! Dictionary<String, Any> 4 //取得データを画面表示用の配列に組み替える処理部分がここに入ります(省略) 5 }catch{ 6 print(error.localizedDescription) 7 } 8}) 9taskReport.resume()
元のJSON
JSON
1["reports": <__NSSingleObjectArrayI 0x6000002035d0>({ 2 columnHeader = { 3 dimensions = ("ga:pageTitle"); 4 }; 5 data = { 6 rows = ({ 7 dimensions = ("A"); 8 metrics = ({ 9 values = (12345); 10 },{ 11 values = (98765); 12 }); 13 }); 14 }; 15})]
以下のAPIからデータ取得しています。
Google Analytics Reporting API v4
https://developers.google.com/analytics/devguides/reporting/core/v4/basics?hl=ja
コメントいただいた不足点の追記です(2018/05/01)
「取得データを画面表示用の配列に組み替える処理部分がここに入ります(省略)」の部分は以下となっています。少し長いのですが。見づらくて申し訳ないです。
//reports以下の階層の処理 let reports = reportJsonData["reports"] as! NSArray //reports以下のデータを取得する for roop in reports { let next = roop as! NSDictionary //連想配列にする let data = next["data"] as! NSDictionary //data以下のデータを取得する //totals以下の階層の処理 let totals = data["totals"] as! NSArray for roopTotals in totals { let nextTotal = roopTotals as! NSDictionary //連想配列にする let totalValues = nextTotal["values"] as! NSArray //values以下のデータを取得する self.totalPvArray.append(totalValues) } //rows以下の階層の処理 var titleArray:[Any] = [] //ページタイトル格納用の空配列 var valuesArray:[Any] = [] //PV格納用の空配列 let rows = data["rows"] as! NSArray for roopNext in rows { let next2 = roopNext as! NSDictionary //連想配列にする let metrics = next2["metrics"] as! NSArray //metrics以下のデータを取得する //metrics以下の階層の処理 var valuesArray2:[Any] = [] for roopNext2 in metrics { let next3 = roopNext2 as! NSDictionary //連想配列にする let values = next3["values"] as! NSArray //values以下のデータを取得する valuesArray2.append(values) } titleArray = titleArray + [next2["dimensions"]!] //配列にページタイトルを格納する valuesArray = valuesArray + valuesArray2 //配列にPVを格納する } //配列を組み替える var count = 0 var count2 = 0 let countTotal = titleArray.count while count < countTotal { let pvArrayLine = [titleArray[count],valuesArray[count2],valuesArray[count2+1]] self.pvArray.append(pvArrayLine) count += 1 count2 += 2 } } //メインスレッドに戻して、テーブルを再描画する DispatchQueue.main.async() { () -> Void in self.PVTable.reloadData() }
回答2件
あなたの回答
tips
プレビュー