(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 in Javaの導入に関しては長くなるため別記事にて解説しており、そちらの内容を前提条件となっています。
⇒記事:JavaでJSON形式のデータから値を抽出する方法+代表的なエラー対処も紹介
(2) JSON配列から値抽出する方法
(2-1) JSON配列のデータの構造例
(2-2) JSON配列のデータの抽出方法
・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)
