質問編集履歴

3 取得したJSONデータを配列化する処理

ToshiyukiSato

ToshiyukiSato score 4

2018/05/01 21:02  投稿

NSSingleObjectArrayIとは?
Swiftにおいて、APIから取得したJSONをパースし、画面に表示しやすいように配列化しました。
その配列をprintすると、以下のように「NSSingleObjectArrayI」というものが入りました。
```Swift
["A", <__NSSingleObjectArrayI 0x604000208cc0>(12345)]
["A", <__NSSingleObjectArrayI 0x604000208cc0>(12345), <__NSSingleObjectArrayI xxxxxxxxxxxxxx>(98765)]
```
この配列をtableViewで画面表示しようとすると、以下のエラーが出ます。
```Swift
Could not cast value of type '__NSSingleObjectArrayI' (0x10dddc328) to 'NSString' (0x10ca08d68).
```
「NSSingleObjectArrayI」とは何なのかをググってみたのですが、よくわかりません。
「NSSingleObjectArrayI」とは何でしょうか?
これを消して、以下のような通常(?)の配列にすることはできませんでしょうか?
的はずれな質問になっていましたら申し訳ございません。
```Swift
["A", 12345]
["A", 12345, 98765]
```
### コメントいただいた不足点の追記です
### コメントいただいた不足点の追記です(2018/04/29)
※コードが長いので今回の相談内容とは関係なさそうな部分は削りましたが、この部分でコメントへの回答になっているか不安です。すみません。
> JSONをパースした方法
```Swift
let taskReport = URLSession.shared.dataTask(with: request, completionHandler: {jsonData, response, error in
   do {
       let reportJsonData = try JSONSerialization.jsonObject(with: jsonData!) as! Dictionary<String, Any>
       //取得データを画面表示用の配列に組み替える処理部分がここに入ります(省略)
   }catch{
       print(error.localizedDescription)
   }
})
taskReport.resume()
```
> 元のJSON
```JSON
["reports": <__NSSingleObjectArrayI 0x6000002035d0>({
   columnHeader = {
       dimensions = ("ga:pageTitle");
   };
   data = {
       rows = ({
           dimensions = ("A");
           metrics = ({
               values = (12345);
           },{
               values = (98765);
           });
       });
   };
})]
```
以下のAPIからデータ取得しています。
Google Analytics Reporting API v4
https://developers.google.com/analytics/devguides/reporting/core/v4/basics?hl=ja
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()
}
```
  • Swift

    8763 questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

2 データ取得元APIを追記

ToshiyukiSato

ToshiyukiSato score 4

2018/04/29 23:10  投稿

NSSingleObjectArrayIとは?
Swiftにおいて、APIから取得したJSONをパースし、画面に表示しやすいように配列化しました。
その配列をprintすると、以下のように「NSSingleObjectArrayI」というものが入りました。
```Swift
["A", <__NSSingleObjectArrayI 0x604000208cc0>(12345)]
```
この配列をtableViewで画面表示しようとすると、以下のエラーが出ます。
```Swift
Could not cast value of type '__NSSingleObjectArrayI' (0x10dddc328) to 'NSString' (0x10ca08d68).
```
「NSSingleObjectArrayI」とは何なのかをググってみたのですが、よくわかりません。
「NSSingleObjectArrayI」とは何でしょうか?
これを消して、以下のような通常(?)の配列にすることはできませんでしょうか?
的はずれな質問になっていましたら申し訳ございません。
```Swift
["A", 12345]
```
### コメントいただいた不足点の追記です
※コードが長いので今回の相談内容とは関係なさそうな部分は削りましたが、この部分でコメントへの回答になっているか不安です。すみません。
> JSONをパースした方法
```Swift
let taskReport = URLSession.shared.dataTask(with: request, completionHandler: {jsonData, response, error in
   do {
       let reportJsonData = try JSONSerialization.jsonObject(with: jsonData!) as! Dictionary<String, Any>
       //取得データを画面表示用の配列に組み替える処理部分がここに入ります(省略)
   }catch{
       print(error.localizedDescription)
   }
})
taskReport.resume()
```
> 元のJSON
```JSON
["reports": <__NSSingleObjectArrayI 0x6000002035d0>({
   columnHeader = {
       dimensions = ("ga:pageTitle");
   };
   data = {
       rows = ({
           dimensions = ("A");
           metrics = ({
               values = (12345);
           },{
               values = (98765);
           });
       });
   };
})]
```
```
以下のAPIからデータ取得しています。
Google Analytics Reporting API v4
https://developers.google.com/analytics/devguides/reporting/core/v4/basics?hl=ja
  • Swift

    8763 questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1 JSONをパースした方法、元のJSONを追記

ToshiyukiSato

ToshiyukiSato score 4

2018/04/29 23:05  投稿

NSSingleObjectArrayIとは?
Swiftにおいて、APIから取得したJSONをパースし、画面に表示しやすいように配列化しました。
その配列をprintすると、以下のように「NSSingleObjectArrayI」というものが入りました。
```Swift
["A", <__NSSingleObjectArrayI 0x604000208cc0>(12345)]
```
この配列をtableViewで画面表示しようとすると、以下のエラーが出ます。
```Swift
Could not cast value of type '__NSSingleObjectArrayI' (0x10dddc328) to 'NSString' (0x10ca08d68).
```
「NSSingleObjectArrayI」とは何なのかをググってみたのですが、よくわかりません。
「NSSingleObjectArrayI」とは何でしょうか?
これを消して、以下のような通常(?)の配列にすることはできませんでしょうか?
的はずれな質問になっていましたら申し訳ございません。
```Swift
["A", 12345]
```
```
### コメントいただいた不足点の追記です
※コードが長いので今回の相談内容とは関係なさそうな部分は削りましたが、この部分でコメントへの回答になっているか不安です。すみません。
> JSONをパースした方法
```Swift
let taskReport = URLSession.shared.dataTask(with: request, completionHandler: {jsonData, response, error in
   do {
       let reportJsonData = try JSONSerialization.jsonObject(with: jsonData!) as! Dictionary<String, Any>
       //取得データを画面表示用の配列に組み替える処理部分がここに入ります(省略)
   }catch{
       print(error.localizedDescription)
   }
})
taskReport.resume()
```
> 元のJSON
```JSON
["reports": <__NSSingleObjectArrayI 0x6000002035d0>({
   columnHeader = {
       dimensions = ("ga:pageTitle");
   };
   data = {
       rows = ({
           dimensions = ("A");
           metrics = ({
               values = (12345);
           },{
               values = (98765);
           });
       });
   };
})]
```
  • Swift

    8763 questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る