Rainbow Planet (GT×IT×SP×SA)

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

01_IT技術 (Technology) 03_Java

JavaでJSON配列から値を抽出する方法+郵便番号検索APIのサンプルプログラムも紹介

投稿日:

(0)目次&概説

(1) 記事の目的
 (1-1) 目的
 (1-2) 前提条件
(2) JSON配列から値抽出する方法
 (2-1) JSON配列のデータの構造例
 (2-2) JSON配列のデータの抽出方法
 (2-3) JSON配列のデータの抽出構文
(3) JSON配列からのデータ抽出サンプルプログラム
 (3-1) サンプルプログラム
 (3-2) 実行結果

(1) 記事の目的

(1-1) 目的

JavaでWebAPIをコールして取得したJSON配列から値を抽出する方法について、構文の確認やサンプルプログラムの紹介を通じて理解を深めます。

目次にもどる

(1-2) 前提条件

・JSON形式の抽出をスムーズに行うためには、やはりライブラリを使うのが近道という事で、今回も「JSON in Java」を利用していきます。
・JSON in Javaの導入に関しては長くなるため別記事にて解説しており、そちらの内容を前提条件となっています。
記事:JavaでJSON形式のデータから値を抽出する方法+代表的なエラー対処も紹介
 

(2) JSON配列から値抽出する方法

(2-1) JSON配列のデータの構造例

・通常のJSONと同様に原則はKeyとValueの組み合わせから成り立っています。
・配列になると、次の例のように[ ]の中に更にJSON形式を入れる事で多重化しています。

目次にもどる

(2-2) JSON配列のデータの抽出方法

・通常のJSON時はJSONObjectクラスのgetString()やgetInt()といったメソッドを利用しましたが、多重になるとJSONArray等を用いて多重にしているケースがあります。

・JSONArrayはイメージとして、配列のJSON版のような感じで[JSONObject1, JSONObject2,…]のようになっています。
・以下の例ではJSON形式の中の”results”というKeyのValueとしてJSONArrayが格納されています。

(図222)

目次にもどる

(2-3) JSON配列のデータの抽出構文

例えば次のようなJSON形式のデータがあるとします。

{
	"message": null,
	"results": [
		{
			"address1": "東京都",
			"address2": "新宿区",
			"address3": "新小川町",
			"kana1": "トウキョウト",
			"kana2": "シンジュクク",
			"kana3": "シンオガワマチ",
			"prefcode": "13",
			"zipcode": "1620814"
		}
	],
	"status": 200
}

これを抽出するための構文は次のようになります。

//### 抽出Step1:まずは全体をJSONObjectに格納
JSONObject json1 = new JSONObject(result);

//### 抽出Step2:その中から配列になっている部分をJSONArrayに格納
JSONArray json2 = json1.getJSONArray("results");

//### 抽出Step3:JSONArrayから、個々のJSONObjectをインデックス指定で抽出
JSONObject json3 = json2.getJSONObject(0);

//### 抽出Step4:個々のJSONObjectからgetStringやgetIntでKey情報を指定して値を抽出
System.out.println("郵便番号 : "+json3.getString("zipcode"));

流れを図で表すと次のようになります。
(図232)

目次にもどる

(3) JSON配列からのデータ抽出サンプルプログラム

(3-1) サンプルプログラム

序盤~中盤(74行目まで)は前提記事にてコメント付で掲載しているため、こちらでは割愛して75行目以降にコメントを入れて掲載します。

package studyc;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.Base64;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.JSONArray;
import org.json.JSONObject;

@WebServlet("/WebAPI_IT0112")
public class WebAPI_IT0112 extends HttpServlet {
        private static final long serialVersionUID = 1L;

    public WebAPI_IT0112() {
        super();
    }

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                String url = "zip-cloud.appspot.com/api/search?zipcode=221-0866";         
                callZipCodeAPI(request,response,url);
        }

        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                doGet(request, response);
        }

        public static void callZipCodeAPI(HttpServletRequest request, HttpServletResponse response,String url) throws IOException {
                String newURL = "https://" + url;
                InputStream crunchifyInStream = null;
                String result = "";
				String tmp = "";
                try {
                        URL myURL = new URL(newURL);
                        URLConnection connection = myURL.openConnection();
                        String authString = "Basic " + Base64.getEncoder();
                        connection.setRequestProperty("Authorization", authString);
                        crunchifyInStream = connection.getInputStream();
                } catch (Exception e) {
                        e.printStackTrace();
                }
                BufferedReader in = new BufferedReader(new InputStreamReader(crunchifyInStream));
                try {
                        while((tmp = in.readLine())!=null) {
                                result += tmp;
                        }
                        in.close();
                } catch (IOException e) {
                        e.printStackTrace();
                }
				
                //### サーブレットの画面描画のコード:START
                response.setContentType("text/html;charset=UTF-8");
                PrintWriter out = response.getWriter();
                out.println("<!DOCTYPE html><html><head><meta charset='UTF-8' /><br />");
                out.println("</head><body>");
                out.println("<br /><br />--------------①全体の結果-------------<br /><br />");
                response.getWriter().append(result);
                out.println("<br /><br />--------------②個別の値を抽出-------------<br /><br />");
				
                //**** 以下、今回の解説対象のJSONの二重配列の抽出 ****//
                //### 抽出Step1:まずは全体をJSONObjectに格納
                JSONObject json1 = new JSONObject(result);
                //### 抽出Step2:その中から配列になっている部分をJSONArrayに格納
                JSONArray json2 = json1.getJSONArray("results");
                //### 抽出Step3:JSONArrayから、個々のJSONObjectをインデックス指定で抽出
                JSONObject json3 = json2.getJSONObject(0);
                //### 抽出Step4:個々のJSONObjectからgetStringやgetIntでKey情報を指定して値を抽出
                response.getWriter().append("郵便番号 : "+json3.getString("zipcode")+"<br />");
                response.getWriter().append("住所1 :   "+json3.getString("address1")+"<br />");
                response.getWriter().append("住所2 :   "+json3.getString("address2")+"<br />");
                response.getWriter().append("住所3 :   "+json3.getString("address3")+"<br />");
                response.getWriter().append("カナ1 :   "+json3.getString("kana1")+"<br />");
                response.getWriter().append("カナ2 :   "+json3.getString("kana2")+"<br />");
                response.getWriter().append("都道府県コード :   "+json3.getString("prefcode")+"<br />");
				
                out.println("</body></html>");
                //### サーブレットの画面描画のコード:END
        }
}

目次にもどる

(3-2) 実行結果

(図321)

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-01_IT技術 (Technology), 03_Java

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

独自ドメインの取得・適用作業の全体像と実際の手順(さくらVPNのLinuxサーバへ適用)

(0)目次&概説 (1) 独自ドメインについて  (1-1) 独自ドメインとは?  (1-2) サブドメインとは?  (1-3) マルチドメインとは? (2) 独自ドメインの取得・適用例  (2-1) …

PythonでHTTP Error 403: Forbiddenエラーが出た時の対処方法とエラーの意味について

(0)目次&概説 (1) エラー:HTTP Error 403: Forbidden  (1-1) 発生状況・エラーメッセージ  (1-2) 原因  (1-3) 対処方法   (1-3-1) 修正前の …

VBAによる郵便番号の正規表現マッチ確認関数&置換関数の作成

(0)目次&概説 (1) 正規表現とは (2) 正規表現はどのような場面で利用される? (3) VBAによる正規表現の簡易チェックツール  (3-1) 郵便番号を抽出したい  (3-2) 正規表現が正 …

PythonのPandas使用時に発生した「UnicodeEncodeError: ‘ascii’ codec can’t encode characters~」エラーの対処方法について

(0)目次&概説 (1) エラー対応1:UnicodeEncodeError  (1-1) 発生状況・エラーメッセージ   (1-1-1) エラーメッセージ   (1-1-2) エラーとなったソース …

ハワイで海外挙式したい人向けモアナチャペルの費用や準備スケジュールの紹介(実体験)

この記事ではハワイで海外挙式したい人に向けての参考情報として「モアナチャペル」での挙式を例に挙げて「費用」と「スケジュール」と「挙式当日の流れ」の3点に焦点を当ててご紹介します。少しでも参考になれば幸 …

  • English (United States)
  • 日本語
Top