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

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

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

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

JSON

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

3257閲覧

AndroidアプリでJSONファイルの文字列を取得して表示する方法

tasojiro

総合スコア16

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

JSON

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2021/06/06 15:33

前提・実現したいこと

Androidのアプリを開発しており、WEBAPIと連携させて取得したJSONファイルから文字列を取得し表示する機能の実装を考えています。

※アプリの開発はAndroid Studioで開発し、WEBAPIはFlaskを利用して開発しています。
DBの作成は、「DB Browser for SQLite」で作成しています。

DBは以下の通りです。
|id|name|message|
|:--|:--:|-:-|
|1|施設A|ここは施設Aの情報です|
|2|施設B|ここは施設Bの情報です|
|3|施設C|ここは施設Cの情報です|

発生している問題・エラーメッセージ

エラー分は以下の通りです。
Object型からArray型(または逆)に変換できません。とのメッセージです。

これは、返されたJAONファイルの記述で’{}’ではなく’[]’となっていることが原因であるかと考えています。

org.json.JSONException: Value [[1,"施設A","ここは施設Aの情報です"], [2,"施設B","ここは施設Bの情報です"],[3,"施設C","ここは施設Cの情報です"]] of type org.json.JSONArray cannot be converted to JSONObject

該当のソースコード

以下は、Android Stdioのコード一部です。(JSONファイルから文字列を取り出す部分)

java

1 @UiThread 2 @Override 3 public void run(){ 4 //ここにUIスレッドで行う処理コード 5 String msg = ""; 6 try { 7 JSONObject rootJSON = new JSONObject(_result); 8 msg = rootJSON.getString("message"); 9 } 10 catch (JSONException ex) { 11 Log.e(DEBUG_TAG, "JSON解析失敗", ex); 12 } 13 TextView tvresult = findViewById(R.id.tv_result); 14 tvresult.setText(msg); 15 }

上記のtry内のコードが、悪いとは思うのですがどう修正したらよいのかわからない状態です。

以下は、WEBAPIのコードです。

Python

1from flask import Flask, app, jsonify, g 2import sqlite3 3 4app = Flask(__name__) 5#JSONでの日本語の文字化け阻止 6app.config['JSON_AS_ASCII'] = False 7 8#DBに接続 9def get_db(): 10 if 'db' not in g: 11 g.db = sqlite3.connect("sample.sqlite3") 12 return g.db 13#DBとの接続を終了 14def close_db(e=None): 15 db = g.pop('db', None) 16 if db is not None: 17 db.close() 18 19@app.route('/', methods=["GET"]) 20def index(): 21 mydata = [] 22 db = get_db() 23 cur = db.execute("select * from mydata") 24 mydata = cur.fetchall() 25 return jsonify(mydata)

上記のreturn文でJSONファイルを返しているのですが、ブラウザで確認したところ

[ [ 1, "施設A", "ここは施設Aの情報です" ], [ 2, "施設B", "ここは施設Bの情報です" ], [ 3, "施設C", "ここは施設Cの情報です" ] ]

となって返されていました。

分からないこと

この問題の解決手段は、
1.WEBAPI側で、アプリ側がJSONObjectで扱えるように取得する。(’{}’→’[]’)
2.アプリ側で、JSONArray内の取得方法を記述してmessageを取得する
かの2パターンあると考えています。

が、どちらもどのようにコーディングすれば問題を解決できるか分からない状態です。
ご教授いただければ幸いです。

不足情報があれば、言っていただけると追記します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず Web API ですが、次のように書き換えるとオブジェクトの配列として返すことができます。

diff

1 def index(): 2- mydata = [] 3 db = get_db() 4 cur = db.execute("select * from mydata") 5- mydata = cur.fetchall() 6+ cur.row_factory = sqlite3.Row 7+ mydata = [dict(row) for row in cur.fetchall()] 8 return jsonify(mydata)

結果はこんな感じになります。

json

1[ 2 { "id": 1, "name": "施設A", "message": "ここは施設Aの情報です" }, 3 { "id": 2, "name": "施設B", "message": "ここは施設Bの情報です" }, 4 { "id": 3, "name": "施設C", "message": "ここは施設Cの情報です" } 5]

ただし、これはあくまでも配列 (オブジェクトが 3 つ入ってる) なので、Android 側では JSONObject ではなく JSONArray として受け取る必要がありますし、message も 3 つあるのでどの message が欲しいかを考える必要があります。

例えば、最初のオブジェクトの message を取得するには次のようにすれば良いでしょう。

diff

1 try { 2- JSONObject rootJSON = new JSONObject(_result); 3- msg = rootJSON.getString("message"); 4+ JSONArray rootJSON = new JSONArray(_result); 5+ msg = rootJSON.getJSONObject(0).getString("message"); 6 }

投稿2021/06/06 21:25

hoshi-takanori

総合スコア7895

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

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

tasojiro

2021/06/07 03:44

回答ありがとうございます。 改善案の通りに修正しましたところ、正確な動作を確認できました。 本当にありがとうございます。JSONの扱い方がとても勉強になりました。 状況に適した「id」や「message」を返せるような工夫や、getJSONの扱いをもっと勉強していきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問