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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

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

JSON

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

PHP

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

Q&A

解決済

1回答

3921閲覧

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

katsuo77

総合スコア28

Objective-C

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

JSON

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

PHP

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

0グッド

2クリップ

投稿2014/10/08 08:02

はじめまして。
現在、データベースから読み出したデータを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

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

どうかよろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

投稿2014/10/08 08:08

TaMaMhyu

総合スコア1356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katsuo77

2014/10/08 10: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ごとに配列にして使いたいと考えているのですがどのような実装方法がありますでしょうか? 追加の質問になってしまいすいません。 よろしくお願いします。
TaMaMhyu

2014/10/08 13:55

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

2014/10/13 05:03

TaMaMhyu様 回答がついていることに気付かず返信が遅れてしまいました。申し訳ありません。 示していただいたものとは別の方法で、なんとか実装することができました。 なるべく動作を早くしたいと考えていましたので、TaMaMhyu様の方法と両方試してみてより早いものを使いたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問