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

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

ただいまの
回答率

90.34%

  • PHP

    21286questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • JSON

    1230questions

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

  • Objective-C

    1206questions

    Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

【Objective-C】AFNetWorkingで受け取ったJSONデータの扱い方

解決済

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 2,669

katsuo77

score 28

はじめまして。
現在、データベースから読み出したデータをJSONでアプリ側に渡す、ということをしようとしているのですがうまくいかず、お力を貸していただけるとありがたいです。
通信にはAFNetworkingを利用しています。

//sample.php
<?php
$sql = sprintf('SELECT id FROM my_table');
$record = mysqli_query($db, $sql) or die(mysqli_error($db));
$recordSet = mysqli_fetch_assoc($record);

header('Content-Type: application/json; charset=utf-8');
echo json_encode($recordSet, JSON_UNESCAPED_UNICODE);
?>

//アプリ
  • (void)viewDidLoad {
    [super viewDidLoad];
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager POST:@"http://sample.php" parameters:nil
          success:^(AFHTTPRequestOperation *operation, id responseObject){
              NSLog(@"id:%@", responseObject);
          }
          failure:^(AFHTTPRequestOperation *operation, NSError *error){
              NSLog(@"Error:%@", error);
          }];
}


たとえば以上のようにすれば値は取得できるのですが、これだと配列の最後の値しか受け取れないので、すべての値を受け取ってアプリ側では配列として扱いたいです。
なのでphpの方で以下のようにループを回して、

//sample.php
<?php
$sql = sprintf('SELECT id FROM my_table');
$record = mysqli_query($db, $sql) or die(mysqli_error($db));

header('Content-Type: application/json; charset=utf-8');

while ($recordSet = mysqli_fetch_aasoc($record)):
echo json_encode($recordSet, JSON_UNESCAPED_UNICODE);
endwhile;
?>

アプリ側で受け取った値を配列にinsertObjectしていけばいいのかと思ったのですが、、、以下のようなエラーが出てしまいました。

JSON text did not start with array or object and option to allow fragments not set


これ以上自力で進めなくなってしまったのですが、どなたかご教授いただけないでしょうか。
初心者なりに考えた結果で的外れなやり方をしようとしているかもしれませんが、そのような場合にも「全然ちがう、普通はこうやる」といったことでも教えていただけると幸いです。

どうかよろしくお願いします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

json_encodeを複数回使用しているので、個別のJSONが生成されて、区切り文字もなしに複数のJSONが出力されてしまいます。不正なJSONになっていると思います。
全件を配列で取得してからjson_encodeで出力すればできると思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2014/10/08 19:37

    お早い回答ありがとうございます。
    ご指摘を受けて以下のように修正したところうまく動きました。

    <?php
    $sql = sprintf('SELECT id FROM my_table');
    $record = mysqli_query($db, $sql) or die(mysqli_error($db));
    $id = array();
    while ($recordSet = mysqli_fetch_assoc($record)):
    array_push($id, $recordSet['id']);
    endwhile;

    header('Content-Type: application/json; charset=utf-8');
    echo json_encode($id, JSON_UNESCAPED_UNICODE);
    ?>

    ちなみに、上のphpをテーブルの特定のカラムではなくすべてのカラムから要素を読み出すようにしたところ(SELECT * FROM my_table)、xcodeのログでは以下のように表示されました。

    {
    id = 0;
    name= apple;
    price = 200;
    },
    {
    id = 1;
    name = orange;
    price = 150;
    }

    これを、idはidごとに、nameはnameごとに配列にして使いたいと考えているのですがどのような実装方法がありますでしょうか?
    追加の質問になってしまいすいません。

    よろしくお願いします。

    キャンセル

  • 2014/10/08 22:55

    カラム名別に分ける意図がいまいちつかめませんが、カラム別配列にするのであれば、
    $idの初期化で、
    $id = array('id' => array(), 'name' => array(), 'price' => array());
    などとして、
    pushしている処理の所を、
    $id['id']などに対してカラム別にpushすればいいかと思います。
    カラム名を動的に確保したければ、未定義の時にarray()で初期化するなどの方法があります。

    キャンセル

  • 2014/10/13 14:03

    TaMaMhyu様

    回答がついていることに気付かず返信が遅れてしまいました。申し訳ありません。

    示していただいたものとは別の方法で、なんとか実装することができました。
    なるべく動作を早くしたいと考えていましたので、TaMaMhyu様の方法と両方試してみてより早いものを使いたいと思います。

    ありがとうございました。

    キャンセル

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

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

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

  • PHP

    21286questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • JSON

    1230questions

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

  • Objective-C

    1206questions

    Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

関連ワード: json text did not start with array or object and option to allow fragments not set afnetworking