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

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

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

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

2138閲覧

レスポンスをjsonではなく配列や連想配列にしたい。

djangorest

総合スコア1

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/11/11 09:55

前提・実現したいこと

django rest frameworkを使いAPIを作ろうと考えています。
レスポンスは基本json形式だということを学んだのですが、配列や連想配列でレスポンスを返すことはできないでしょうか?
自作するとしたらどういった知識が必要かも把握しきれていません。
よろしくお願いします。

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

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

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

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

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

TakaiY

2020/11/11 10:37

jsonって配列や連想配列を表現したものなのですが、実現したいことはどんなことでしょう?
djangorest

2020/11/11 12:20

返信ありがとうございます。 自分がやりたいことは、レスポンスを [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]のようにできないのかなということでした。 jsonの場合 例 変数名 = { "名前" : [ "イチロー", "鈴木一朗" ], "出身地" : "日本" } 変数名.名前[0] のように連想配列みたいな形で取り出すことになるところを 変数名[0]で取り出せる 変数名=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] のような形にしたいと考えています。 レスポンスで受け取ったものがjson形式ではなくただの配列であれば レスポンスデータを直接配列の変数に代入 変数名=APIのレスポンスデータ(配列) ということができないかと考えました。 変数名=API("パラメータ") ※戻り値あり みたいな使い方ができるAPIを作りたかったです。 APIを関数みたいにしたいです。 知識があまりなく説明がへたくそでごめんなさい...
guest

回答2

0

レスポンスは基本json形式だということを学んだのですが、配列や連想配列でレスポンスを返すことはできないでしょうか?

JSON形式じゃなくても良いのですが、普通は文字列で返します。
プログラミング言語で扱うメモリ上の配列や連想配列は、「必ずしもメモリ上で連続しているとか限らないバイナリーのかたまり」なので、そのままではレスポンスには出来ません。これらを文字列(あるいは連続したバイト列)に変換することを「シリアライズ」と言います。

シリアライズには、言語に依存したシリアライズ形式と、XML/YAML/JSONといった多くの言語で扱えるシリアライズ形式があります。
$a = [0,1,2,3,4,5];という配列データがあったときに、これをjson_encode関数でJSON化すると"[0,1,2,3,4,5]"という文字列になります。

ということで、「JSON」の意味を理解されていないのではないでしょうか?

自作するとしたらどういった知識が必要か

文字列化せずに、例えば上記$aだと、pack関数で「4バイト整数内部表現を6個並べた物」の24バイトのバイナリーデータとして渡すことは一応可能です。ただ、「4バイト整数内部表現を6個並べた物」しか返さないAPIだとそれで良いのですが、汎用性を求めるなら、4バイトのリトルエンディアンの整数データであることとか、個数が6個であることとかを、その外側に情報として付加しないといけないので、なかなか扱うのが面倒です。
なので、普通は独自にロジックを考えてもメリット無いです。

投稿2020/11/11 15:16

otn

総合スコア85901

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

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

djangorest

2020/11/11 15:35

jsonの意味をしっかりと把握できていませんでした... APIに関しての内部の仕組みをしっかりと理解しておらず、自分が言っていることがそもそも おかしいことに気づくことができました。 APIについて勉強するのが始めてだったのでとても参考になりました。 ありがとうございます!!
guest

0

ベストアンサー

「配列をそのまま送りたい」ということが、"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]"という文字列をそのまま送りたいということだとすると、HTTPのボディーとしてHTML文字列の代りに送ればいいので難しくはありません。

ただ、その方法だと1つのデータしか送れません。通常のAPIであれば、一度に複数の情報が必要になります。 たとえば、応答として「処理結果(成功/失敗)」と「データ」などです。
であれば、1バイト目が結果で、その後がデータ本体で...などとすることもできますが、変更に弱くなり、また、そもそもそのデータを手元の配列からわざわざ作らなければなりません。
であればjsonのように明示的に連想配列とした方が明確でわかりやすく、変更にも強いということになります。

別の観点で言えば、jsonは各言語でのサポートが充実していて、json形式とその言語の内部形式との相互の変換が容易にできるようになっています。

APIのデータ形式として独自のものを利用する場合、相手にもそれを実装する必要があり、そのことを考えると、jsonにしておいたほうが楽なのです。

ということで、通常のデータのやりとりをする場合、jsonを使うのはいい方法なのです。

投稿2020/11/11 13:06

TakaiY

総合スコア13790

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

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

djangorest

2020/11/11 13:17

返信ありがとうございます!! なんで配列をそのままレスポンスすればいいところをjson形式にしているのだろうとずっと疑問でした。 その結果このような質問をさせていただいたのですが、とても納得のいく回答でした。 json形式が扱いにくいという認識でいたので考え方が変わりました。 丁寧に教えていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問