質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • Swift

    7658questions

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

  • JSON

    1231questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • Twitter

    699questions

    Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

SwiftでJSONパース

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 615

gtime

score 42

import UIKit
import TwitterKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setNeedsStatusBarAppearanceUpdate();
        let logInButton = TWTRLogInButton { (session, error) in
            if let unwrappedSession = session {
                let alert = UIAlertController(title: "Logged In",
                                              message: "User \(unwrappedSession.userName) has logged in",
                    preferredStyle: UIAlertControllerStyle.alert
                )
                alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
                self.present(alert, animated: true, completion: nil)

            } else {
                print("Login error: %@", error!.localizedDescription);
            }
        }
        logInButton.loginMethods = [.webBased]

        let button = logInButton
        button.center = self.view.center
        self.view.addSubview(button)
        //ここからツイート投稿のための準備
        let endpoint = "https://api.twitter.com/1.1/statuses/home_timeline.json"

        let client = TWTRAPIClient.init(userID: "111111111")

        var clientError : NSError?

        let params = ["count": "10"]

        let request = client.urlRequest(withMethod: "GET", url: endpoint, parameters: params, error: &clientError)

        client.sendTwitterRequest(request) {
            (response, data, connectionError) -> Void in
            if connectionError != nil {
                print("エラー: \(connectionError)")
            } else {

                let json: AnyObject? = try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments) as AnyObject?
                print(json!)
            }
        }

    }
}


このようにTwitterのタイムラインのJSONを受信することはできたのですが、Swiftでforeachで配列を回して、ツイート本文やユーザーネームを取り出して表示するにはどのようにすればいいのでしょうか?

JSONはこのような感じです
[
{
"place" : null,
"contributors" : null,
"source" : "<a href=\"http:\/\/twitter.com\" rel=\"nofollow\">Twitter Web Client<\/a>",
"truncated" : false,
"is_quote_status" : false,
"favorite_count" : 0,
"lang" : "ja",
"entities" : {
"symbols" : [

],
"user_mentions" : [

],
"urls" : [

],
"hashtags" : [

]
},
"in_reply_to_screen_name" : null,
"retweet_count" : 0,
"favorited" : false,
"geo" : null,
"id" : 852734851786579974,
"user" : {
"protected" : false,
"is_translator" : false,
"profile_image_url" : "http:\/\/pbs.twimg.com\/profile_images\/850998804878774272\/-bABtccG_normal.jpg",
"created_at" : "Mon Apr 05 08:12:28 +0000 2010",
"id" : 129746204,
"default_profile_image" : false,
"listed_count" : 1542,
"profile_background_color" : "131516",
"follow_request_sent" : false,
"location" : "PSO2",
"entities" : {
"url" : {
"urls" : [
{
"url" : "http:\/\/www.pixiv.net\/member.php?id=76712",
"indices" : [
0,
40
],
"expanded_url" : null
}
]
},
"description" : {
"urls" : [
{
"display_url" : "ask.fm\/patrietta",
"url" : "https:\/\/t.co\/fLNYk70nQJ",
"indices" : [
67,
90
],
"expanded_url" : "http:\/\/ask.fm\/patrietta"
}
]
}
},
"url" : "http:\/\/www.eeee.net\/member.php",
"description" : "とあるuser",
"followers_count" : 69707,
"geo_enabled" : false,
"lang" : "ja",
"profile_text_color" : "333333",
"statuses_count" : 55066,
"following" : true,
"notifications" : false,
"profile_background_tile" : true,
"profile_use_background_image" : true,
"id_str" : "129746204",
"name" : "あるuser",
"profile_image_url_https" : "https:\/\/pbs.twimg.com\/profile_images\/850998804878774272\/-yff8f6fyh.jpg",
"profile_sidebar_fill_color" : "EFEFEF",
"profile_sidebar_border_color" : "FFFFFF",
"contributors_enabled" : false,
"default_profile" : false,
"profile_banner_url" : "https:\/\/pbs.twimg.com\/profile_banners\/129746204\/1471936684",
"screen_name" : "ここがスクリーンネーム",
"time_zone" : "Tokyo",
"profile_background_image_url" : "http:\/\/pbs.twimg.com\/profile_background_images\/454304509376741376\/lTp51aDO.jpeg",
"profile_background_image_url_https" : "https:\/\/pbs.twimg.com\/profile_background_images\/454304509376741376\/lTp51aDO.jpeg",
"profile_link_color" : "F5ABB5",
"favourites_count" : 3889,
"is_translation_enabled" : false,
"translator_type" : "none",
"utc_offset" : 32400,
"friends_count" : 1233,
"verified" : false,
"has_extended_profile" : true
},
"in_reply_to_user_id" : null,
"retweeted" : false,
"text" : "ツイート本文",
"created_at" : "Fri Apr 14 04:06:46 +0000 2017",
"in_reply_to_status_id_str" : null,
"in_reply_to_status_id" : null,
"in_reply_to_user_id_str" : null,
"id_str" : "852734851786579974",
"coordinates" : null
}
]

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2017/04/10 11:28

    ダミーのJSONなどを用意して、こちらで再現出来るようにして下さい。

    キャンセル

  • gtime

    2017/04/14 13:15

    ありがとうございます。JSONを追加しました

    キャンセル

回答 1

checkベストアンサー

+1

let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [[String:Any]]

for obj in json {
    //screen_name
    if let user = obj["user"] as? [String:Any] {
        let screen_name = user["screen_name"] ?? "(empty)"
        print("screen_name =", screen_name)
    } else {
        print("does not exist 'user'")
    }
    //text
    let text = obj["text"] ?? "(empty)"
    print("text =", text)
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/14 16:46

    ありがとうございます
    パースすることができました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Swift

    7658questions

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

  • JSON

    1231questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • Twitter

    699questions

    Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。