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

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

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

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

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

3回答

4112閲覧

HTTP通信でJSONデータをカラムごとに取得したいです。

s.k

総合スコア423

JSON

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

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

1クリップ

投稿2017/05/29 03:18

###前提・実現したいこと
RailsAPIからJSONデータをカラムごとにAndroid側で取得したいです。
取得するデータは以下です。(en_titleカラムの値を取得したいです。)

[{"id":1,"en_title":"Shinjuku East Exit","ja_title":"新宿駅 東口","en_content":"FirstKitchen Mac Wi-fi","ja_content":"ファーストキッチン マクドナルド ワイファイ","url":{"url":null},"created_at":"2017-05-28T06:43:53.150Z","updated_at":"2017-05-28T06:43:53.150Z"}]

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

HTTP通信でテキストデータで取得できるのですが、
JSONデータだと表示できません。

①HTTP通信で流れてきた情報を文字列型で取得
②①をJSONオブジェクトに変換
③特定のカラム(en_title)で取得

の流れを想定しています。

Java

1public class HttpApi extends Activity implements View.OnClickListener { 2 private final static int WC = LinearLayout.LayoutParams.WRAP_CONTENT; 3 private final static int MP = LinearLayout.LayoutParams.MATCH_PARENT; 4 private final static String TAG_READ = "read"; 5 private EditText editText; 6 private String text; 7 private Handler handler = new Handler(); 8 private JSONObject json; 9 private String jsonObject; 10 11 //テキストファイルのURLの指定(1) 12 private final static String URL = 13 "http://candii.tk/api/v1/images"; 14 15 //アクティビティ起動時に呼ばれる 16 @Override 17 public void onCreate(Bundle bundle) { 18 super.onCreate(bundle); 19 requestWindowFeature(Window.FEATURE_NO_TITLE); 20 21 //レイアウトの生成 22 LinearLayout layout = new LinearLayout(this); 23 layout.setBackgroundColor(Color.WHITE); 24 layout.setOrientation(LinearLayout.VERTICAL); 25 setContentView(layout); 26 27 //エディットテキストの生成 28 editText = new EditText(this); 29 editText.setText(""); 30 editText.setLayoutParams(new LinearLayout.LayoutParams(MP, WC)); 31 layout.addView(editText); 32 33 //ボタンの生成 34 layout.addView(makeButton("HTTP通信", TAG_READ)); 35 } 36 37 //ボタンの生成 38 private Button makeButton(String text, String tag) { 39 Button button = new Button(this); 40 button.setText(text); 41 button.setTag(tag); 42 button.setOnClickListener(this); 43 button.setLayoutParams(new LinearLayout.LayoutParams(WC, WC)); 44 return button; 45 } 46 47 //ボタンクリック時に呼ばれる 48 public void onClick(View v) { 49 String tag = (String)v.getTag(); 50 if (TAG_READ.equals(tag)) { 51 //スレッドの生成(4) 52 Thread thread = new Thread(new Runnable() {public void run() { 53 //HTTP通信 54 try { 55 text = new String(http2data(URL)); 56 } catch (Exception e) { 57 text = null; 58 } 59 //ハンドラの生成(5) 60 handler.post(new Runnable() {public void run() { 61 if (text != null) { 62 editText.setText(text); 63 } 64 }}); 65 }}); 66 thread.start(); 67 } 68 } 69 70 //HTTP通信 71 public static String http2data(String path) throws Exception { 72 byte[] w=new byte[1024]; 73 HttpURLConnection c = null; 74 InputStream in = null; 75 ByteArrayOutputStream out = null; 76 try { 77 //HTTP接続のオープン(2) 78 URL url = new URL(path); 79 c = (HttpURLConnection)url.openConnection(); 80 c.setRequestMethod("GET"); 81 c.connect(); 82 in = c.getInputStream(); 83 String readSt = readInputStream(in); ---84 JSONObject jsonData = new JSONObject(readSt); ---85 String st = jsonData.getString("en_title"); ---86 87 88 89 //HTTP接続のクローズ(3) 90 in.close(); 91 c.disconnect(); 92 return st; 93 94 } catch (Exception e) { 95 try { 96 if (c != null) c.disconnect(); 97 if (in != null) in.close(); 98 if (out != null) out.close(); 99 } catch (Exception e2) { 100 } 101 throw e; 102 } 103 } 104 105 public static String readInputStream(InputStream in) throws IOException, UnsupportedEncodingException { 106 StringBuffer sb = new StringBuffer(); 107 String st = ""; 108 109 BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8")); 110 while((st = br.readLine()) != null) 111 { 112 sb.append(st); 113 } 114 try 115 { 116 in.close(); 117 } 118 catch(Exception e) 119 { 120 e.printStackTrace(); 121 } 122 123 return sb.toString(); 124 } 125}

①までの結果

取得できたもの

[{"id":1,"en_title":"Shinjuku East Exit","ja_title":"新宿駅 東口","en_content":"FirstKitchen Mac Wi-fi","ja_content":"ファーストキッチン マクドナルド ワイファイ","url":{"url":null},"created_at":"2017-05-28T06:43:53.150Z","updated_at":"2017-05-28T06:43:53.150Z"}]

③までの結果

こちらは何も取得できませんでした。。。

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

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

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

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

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

guest

回答3

0

うーんと
文字列の両端にある[]がいけないのでは?
Rails側で[]jsonのarrayをjsonにして送り直すか
1と2の間に
readSt.substring(0, readSt.length()-1)
を挟んで[]を消すかしたらいいのでは

投稿2017/05/29 03:35

moke

総合スコア2241

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

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

0

JSONのフォーマットを見ると[]で囲われているので配列ですね。
JSONObjectではなく、JSONArrayを使うと出来ると思いますよ。

投稿2017/05/29 03:25

編集2017/05/29 03:42
yona

総合スコア18155

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

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

moke

2017/05/29 03:37

JSONArrayってありましたね。忘れてました。
guest

0

自己解決

ありがとうございます。
いただいた情報を元に自分なりに修正を加え解決することができました。

①リスト作成
②JSON配列作成
③繰り返し処理で①にJSON格納
④カラム指定
⑤配列で取得
⑥繰り返し処理

の流れで実現しました!

お2人、ご回答ありがとうございます。

Java

1public class HttpApi extends Activity implements View.OnClickListener { 2 private final static int WC = LinearLayout.LayoutParams.WRAP_CONTENT; 3 private final static int MP = LinearLayout.LayoutParams.MATCH_PARENT; 4 private final static String TAG_READ = "read"; 5 private EditText editText; 6 private ArrayList<String> text; 7 private Handler handler = new Handler(); 8 private JSONObject json; 9 private String jsonObject; 10 11 //テキストファイルのURLの指定(1) 12 private final static String URL = 13 "http://candii.tk/api/v1/images"; 14 15 //アクティビティ起動時に呼ばれる 16 @Override 17 public void onCreate(Bundle bundle) { 18 super.onCreate(bundle); 19 requestWindowFeature(Window.FEATURE_NO_TITLE); 20 21 //レイアウトの生成 22 LinearLayout layout = new LinearLayout(this); 23 layout.setBackgroundColor(Color.WHITE); 24 layout.setOrientation(LinearLayout.VERTICAL); 25 setContentView(layout); 26 27 //エディットテキストの生成 28 editText = new EditText(this); 29 editText.setText(""); 30 editText.setLayoutParams(new LinearLayout.LayoutParams(MP, WC)); 31 layout.addView(editText); 32 33 //ボタンの生成 34 layout.addView(makeButton("HTTP通信", TAG_READ)); 35 } 36 37 //ボタンの生成 38 private Button makeButton(String text, String tag) { 39 Button button = new Button(this); 40 button.setText(text); 41 button.setTag(tag); 42 button.setOnClickListener(this); 43 button.setLayoutParams(new LinearLayout.LayoutParams(WC, WC)); 44 return button; 45 } 46 47 //ボタンクリック時に呼ばれる 48 public void onClick(View v) { 49 String tag = (String)v.getTag(); 50 if (TAG_READ.equals(tag)) { 51 //スレッドの生成(4) 52 Thread thread = new Thread(new Runnable() {public void run() { 53 //HTTP通信 54 try { 55 text = new ArrayList(http2data(URL)); ⑤配列で取得 56 } catch (Exception e) { 57 text = null; 58 } 59 //ハンドラの生成(5) 60 handler.post(new Runnable() {public void run() { 61 if (text != null) { 62 for (int i = 0; i < text.size(); i++) { ⑥繰り返し処理 63 editText.setText(text.get(i)); 64 } 65 } 66 }}); 67 }}); 68 thread.start(); 69 } 70 } 71 72 //HTTP通信 73 public static ArrayList<String> http2data(String path) throws Exception { 74 byte[] w=new byte[1024]; 75 HttpURLConnection c = null; 76 InputStream in = null; 77 ByteArrayOutputStream out = null; 78 try { 79 //HTTP接続のオープン(2) 80 URL url = new URL(path); 81 c = (HttpURLConnection)url.openConnection(); 82 c.setRequestMethod("GET"); 83 c.connect(); 84 in = c.getInputStream(); 85 String readSt = readInputStream(in); 86 87 ArrayList<String> list = new ArrayList<>(); ①リスト作成 88 JSONArray jsonArray = new JSONArray(readSt); ②JSON配列作成 89 90 for (int i = 0; i < jsonArray.length(); i++) { ③繰り返し処理で①にJSON格納 91 //JSONオブジェクトをパースして、レコードのname属性をログ出力 92 JSONObject jsonObject = jsonArray.getJSONObject(i); 93 list.add(jsonObject.getString("en_title")); ④カラム指定 94 } 95 96 //HTTP接続のクローズ(3) 97 in.close(); 98 c.disconnect(); 99 return list; 100 101 } catch (Exception e) { 102 try { 103 if (c != null) c.disconnect(); 104 if (in != null) in.close(); 105 if (out != null) out.close(); 106 } catch (Exception e2) { 107 } 108 throw e; 109 } 110 } 111 112 public static String readInputStream(InputStream in) throws IOException, UnsupportedEncodingException { 113 StringBuffer sb = new StringBuffer(); 114 String st = ""; 115 116 BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8")); 117 while((st = br.readLine()) != null) 118 { 119 sb.append(st); 120 } 121 try 122 { 123 in.close(); 124 } 125 catch(Exception e) 126 { 127 e.printStackTrace(); 128 } 129 130 return sb.toString(); 131 } 132}

投稿2017/05/29 07:30

s.k

総合スコア423

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問