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

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

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

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

JSON

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

52605閲覧

JSONの並び順が変わってしまう。

redpanda

総合スコア123

Objective-C

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

JSON

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

2クリップ

投稿2016/02/15 17:37

JSONの取得について教えてください。

やりたいこと:
サーバ側で生成したJSONを、同じ構成(順番)でクライアント側で取り出したい。

環境:
サーバ側:JDK 1.7.0_80, Tomcat 6
クライアント側:iPhone 6s (Objective-C)

サーバ側からGoogleのGSONを利用してJSONをクライアントに返します。
※下記valはObject型

Java

1Gson gson = new GsonBuilder().serializeNulls().create(); 2responseBody = gson.toJson(val).getBytes(encoding); 3``` 4 5クライアント側でレスポンスを受け取ります。 6 7```OBJC 8NSDictionary *jsonValue = [NSJSONSerialization JSONObjectWithData:(NSData *)responseObject options:kNilOptions error:&jsonError]; 9``` 10 11送信時のresponseBodyと受信側のjsonValueの値の順番がかなり変わってしまうのですが、どの当たりに問題がありますでしょうか。
usamino👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

Objective-C も、最近の Java もとんと縁のないおっさんが口を挟むのもアレなんですが、順番が変わる、というのは、

json

1{ 2 "suneo": { "id": 1, "score": 62, "fullname": "Suneo Honokawa" }, 3 "takeshi": { "id": 2, "score": 32, "fullname": "Takeshi Goda" } 4} 5```というものを送ったのに、`jsonValue` の中で `"takeshi"` のほうが先にきちゃったり、ということでしょうか。 6だとすると、それは正しい動きです。 7JSON において、 8```json 9{ 10 <<key1>>: <<value1>>, 11 <<key2>>: <<value2>>, 12 ... 13} 14```という表現は、連想配列 (or ハッシュ or 辞書) を表現したものであり、連想配列には「順序」の概念はありません。key に対応して value が決まっている、というだけです。Java における `val` という連想配列(これには「順序」という概念なし)を交換用に書き出したら、たまたまある特定の「順序」に並び、また、それを Objective-C の中で `jsonValue` という連想配列に直したもの (これには「順序」という概念なし) を表示してみたら、ある特定の「順序」に並んでいる、ということです。 15順番が大事、というのであれば、その部分について、元々のデータを連想配列でなく配列で持つ必要があります。先の例で言えば次のようになるでしょう。 16```json 17[ 18 { "name": "suneo", "id": 1, "score": 62, "fullname": "Suneo Honokawa" }, 19 { "name": "takeshi":, "id": 2, "score": 32, "fullname": "Takeshi Goda" } 20]

と、状況を推察して書きましたが、的外れだったらごめんなさい。

投稿2016/02/15 20:35

unau

総合スコア2468

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

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

redpanda

2016/02/15 23:49

ご回答ありがとうございます。質問の意図はその通りです。 ご指摘いただいた内容(JSON配列)について少し理解があったのですが、気になる点がありまして。 実はサーバ側のレスポンス(を返しているプログラム)はAPIでして、他のクライアントプログラムJavaScript、Android(Java)も受け取っているのですが、そちらはJSONの要素順が変わらず、サーバ側からの送信時と同様に展開されています。 また、サーバ側のJSONライブラリにつきましても、JSONIC等では並びが変わる場合があるが、GSONでは並びが変わらないという情報もあったので気になっています。
maisumakun

2016/02/16 00:35

「順番が変わらない」といっても2通りの可能性があって、PHPの連想配列やRuby 1.9以降のハッシュのように「それが仕様として明記してある」場合と、「たまたまそう動いているだけ」ということが考えられます。仕様に書いていない場合、入力データやバージョンによっては動きが変わってしまうので、その順番に依存するとあとあと動かなくなる恐れがあります。
unau

2016/02/16 01:00

maisumakun さんがおっしゃっているように、「連想配列の要素に連続的にアクセスしたときの順番」は、それが同じ順番で得られたとしても、明示的に仕様として書かれているとき以外は「たまたま順番が同じだった」というだけです。 個々のシステム内でのデータ保存形式として使っている場合はまだよいのですが、ここでの例のように、異種システム間での交換形式として考えた場合は、JSON の連想配列に順番の保証を期待してはいけません。「並びが変わらない」ライブラリの例をいくつか挙げられていますが、それらは「たまたま」同じなだけ、と考えるべきです。
redpanda

2016/02/16 02:10

maisumakun さん unau さん ご回答ありがとうございます。解決しました。 もう一度、細かい調査を進めた結果、入れ子になった内部のJSONがやはり配列になっていなかったことが確認できました。動作に関しましてもやはり「たまたま」だったのでしょうね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問