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

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

新規登録して質問してみよう
ただいま回答率
85.49%
JSON

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

PHP

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

Swift

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

Q&A

解決済

2回答

8753閲覧

Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0.

tarofess

総合スコア127

JSON

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

PHP

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

Swift

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

0グッド

0クリップ

投稿2016/09/25 00:48

編集2016/09/28 07:07

現在SwiftでPOST通信を行い、jsonで値を取得しようとしているのですが、「Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0.」というエラーが出て値を取得できません。

Swift

1let task = URLSession.shared.dataTask(with: request) { (data, response, error) -> Void in 2 if error == nil { 3 print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue)) 4 do { 5 let jsonResult = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String: String] 6 print(jsonResult) 7 } catch { 8 print("jsonError: \(error)") 9 } 10

上記のコードの

Swift

1print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue))

で値は以下のように出力されています。

Optional(array(30) {
[0]=>
array(1) {
["名詞"]=>
string(6) "電車"
}
[1]=>
array(1) {
["名詞"]=>
string(15) "コンセント"
}
.
.
.
}

ここからJSONSerialization.jsonObjectでパースするにはどのようにすればいいでしょうか?
どなたかわかる方がいれば教えていただきたいです。よろしくお願いします。

///追記///

print(jsonResult)は通ってないので何も出力がされてないです。「as! [String: String]」を削除して、あれから少しphp側もいじるとprint(NSString(data: data!, encoding: String.Encoding.utf8.rawValue))では

string(1153) "[{"\u540d\u8a5e":"\u30cf\u30b5\u30df"},{"\u540d\u8a5e":"\u30d2\u30e8\u30b3"},..........]

という出力結果になりましたが、結局try JSONSerialization.jsonObjectで「Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.」のエラーが返ってきます......。

///追記///

以下はphp側の処理になります。

php

1class DBHelper { 2 3 public function getDataFromDB() { 4 try { 5 $pdo = new PDO($dsn, $username, $password); 6 $stmt = $pdo->prepare('SELECT * FROM word WHERE speech = ?'); 7 $stmt->bindValue(1, $this->getSpeechFromClient()); 8 $stmt->execute(); 9 $results = $stmt->fetchAll(); 10 11 } catch (PDOException $e) { 12 return NULL; 13 } 14 15 $distinctWords = $this->removeDuplication($this->getWordFromClient(), $results); 16 17 return $distinctWords; 18 } 19 20 public function getSpeechFromClient() { 21 $json_string = file_get_contents('php://input'); 22 $obj = json_decode($json_string, true); 23 24 return $obj['speech']; 25 } 26 27 public function getWordFromClient() { 28 $clientWord = array(); 29 30 $json_string = file_get_contents('php://input'); 31 $obj = json_decode($json_string, true); 32 33 foreach($obj['words'] as $value) { 34 array_push($clientWord, $value); 35 } 36 37 return $clientWord; 38 } 39 40 public function removeDuplication($clientData, $serverData) { 41 $serverData = array_diff($serverData, $clientData); 42 shuffle($serverData); 43 44 $data = array(); 45 $speech = $this->getSpeechFromClient(); 46 47 if (count($serverData) >= 30) { 48 for ($i = 0; $i < 30; $i++) { 49 $data += [$speech => $serverData[$i]['word']]; 50 } 51 return $data; 52 53 } else { 54 return NULL; 55 } 56 } 57} 58 59///main/// 60 61$dbhelper = new DBHelper(); 62$words = $dbhelper->getDataFromDB(); 63$jsonWords = json_encode($words); 64 65echo $jsonWords; 66 67?>

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

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

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

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

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

fuzzball

2016/09/26 02:31

print(jsonResult)の出力を教えて下さい。「as! [String: String]」を削除するとどうなるでしょうか?
fuzzball

2016/09/26 22:29

APIからはJSONで返ってきてるんでしょうか?APIからの生データを教えて下さい。
guest

回答2

0

(deleted)

投稿2016/09/27 22:20

編集2016/09/27 22:22
fuzzball

総合スコア16731

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

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

0

ベストアンサー

おそらくAPIからのデータがJSONではないと思います。JSONなら、

swift

1print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue))

の出力がJSONのテキスト文字列になるはずです。

投稿2016/09/26 23:41

fuzzball

総合スコア16731

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

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

tarofess

2016/09/27 13:33

ご回答ありがとうございます。 どうやらやはりAPIからのデータがJSONではなかったみたいです。試しにarray('piyo' => 'piyopiyo')というような簡単な配列を作って返すとエラーが表示されずに正しく取得できるようになりました。 しかし後一歩のところで自分のやりたいことがうまくいきません。 現在以下のようにしてJSON用の配列を作成しています。 for ($i = 0; $i < 30; $i++) {  array_push($data, array($speech => $serverData[$i]['word'])); } しかしこのままだと今までのようにエラーが出てうまくいかず、array_pushの行を $data += array($speech => $serverData[$i]['word']); と書き換えてもarrayに値が一つしか入りません。 どうすればJSONを作れるような配列の形を保ちつつ30個の「$speech => $serverData[$i]['word']」を入れることができるでしょうか?
fuzzball

2016/09/27 22:55 編集

PHPのタグを付けるか新規に質問して下さい。 あと、json_encodeを含めたPHP側のコードを質問欄に追記して下さい。
tarofess

2016/09/28 07:08

phpのタグを追加して、php側のコードを追記しました。 なおデータベースに接続するための$dsn, $username, $passwordは省いてますが接続はできてます。
fuzzball

2016/09/28 08:00

ちょっとPHPの勉強をしてきましたw arrayへの追加は、$hoge[] = "hoge"; でいけるようなので、 $data[] = [$speech => $serverData[$i]['word']]; ではどうでしょうか? ちなみに、[$speech => $serverData[$i]['word']] という書式がまだ分かってないのですが、$speechにはどんな形式(型)でデータが入っているのでしょうか? $speech[$serverData[$i]['word']] ではないのでしょうか?
tarofess

2016/09/28 08:38

解決できました! for文で回してarrayに追加する行を array_push($data, [$speech => $serverData[$i]['word']]); とすることで連想配列に追加していくことができました。 $speechにはStringの文字列が入っており、[$speech => $serverData[$i]['word']]でStringの文字列をキーにした連想配列ができました。 phpの書き方もよくわからずずっと止まってしまってたのですがおかげで解決できました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問