サーブレットでJSONパースをやってみよう。JavaでJSONパースを行う場合様々なライブラリがあるが、今回はその中の一つGsonを使う。

●●Jsonパースの手順●●
1.エクリプス動的プロジェクトから[joytas12]を作成。
2.下からgson.jarファイルをダウンロード


3.WEB-INF/lib/ファルダのにgson.jarをコピペで配置する。
4.下からcolors.jsonをダウンロード

5.WEB-INF/にdataフォルダを作成し、その中にcolors.jsonを配置する。
6.modelパッケージにColor.java(Beans)を以下のように作成する。
●model.Color.java

package model;
import java.io.Serializable;
public class Color implements Serializable{
	private String nameJ,nameEn,code;
	private String[] effects;
	public Color(){}
	public Color(String nameJ, String nameEn, String code, String[] effects) {
		super();
		this.nameJ = nameJ;
		this.nameEn = nameEn;
		this.code = code;
		this.effects = effects;
	}
	public String getNameJ() {
		return nameJ;
	}
	public void setNameJ(String nameJ) {
		this.nameJ = nameJ;
	}
	public String getNameEn() {
		return nameEn;
	}
	public void setNameEn(String nameEn) {
		this.nameEn = nameEn;
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String[] getEffects() {
		return effects;
	}
	public void setEffects(String[] effects) {
		this.effects = effects;
	}
	

}

6.controllerパッケージにMain.java(Servlet)を以下のように作成する。
●controller.Main.java

package controller;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
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 com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.stream.JsonReader;

import model.Color;

@WebServlet("/Main")
public class Main extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		ServletContext application = this.getServletContext();
		//ファイルのパス取得
		String path=application.getRealPath("/WEB-INF/data/colors.json");
		
		FileInputStream fis=new FileInputStream(path);
		InputStreamReader isr=new InputStreamReader(fis,"UTF-8");
		//InputStreamReaderからJsonReaderインスタンスを作成する
		JsonReader reader=new JsonReader(isr);
		//今回jsonデータはルートが配列なのでまずはその配列オブジェクトを生成する。
		JsonArray jsonArr=new Gson().fromJson(reader, JsonArray.class);
		//データをlistに格納するための準備
		List<Color> list=new ArrayList<>();
		//JsonArrayを要素の数だけ回すループ
		for(int i=0;i<jsonArr.size();i++){
			//カラークラスのインスタンス生成
			Color c=new Color();
			//get(index)でJsonObjectインスタンスを取得
			JsonObject obj=(JsonObject) jsonArr.get(i);
			//objインスタンスのデータをもとに、カラークラスインスタンスのプロパティを設定する。
			c.setNameJ(obj.get("nameJ").getAsString());
			c.setNameEn(obj.get("nameEn").getAsString());
			c.setCode(obj.get("code").getAsString());
			//effectsは配列なのでJsonArrayとして取得する。
			JsonArray effects=obj.get("effects").getAsJsonArray();
			//カラークラスのeffectsプロパティにセットする配列を準備
			String[] effectsArr=new String[effects.size()];
			//effectsの数分だけループを回す。
			for(int j=0;j<effects.size();j++){
				//effectsから一つ要素を取り出し、配列につめる。
				effectsArr[j]=effects.get(j).getAsString();
			}
			//カラークラスのeffectsフィールドに設定
			c.setEffects(effectsArr);
			//作成されたインスタすをリストに詰める。
			list.add(c);
		}
		/*
		応用:Gsonであれば以下の1行でもlistを作れる
		
		List<Color> list = new Gson().fromJson(reader, new TypeToken<List<Color>>(){}.getType());
		*/
		
		request.setAttribute("list", list);
		RequestDispatcher rd=request.getRequestDispatcher("/WEB-INF/view/main.jsp");
		rd.forward(request, response);
			
	}

	

}

7.WEB-INFの中にviewフォルダを作り、その中にmain.jspを作成する。
●main.jsp(WEB-INF/view/main.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*,model.*"%>
<%
List<Color> list=(List<Color>)request.getAttribute("list");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Joytas12(JSON parse)</title>
</head>
<body>
<%if(list != null && list.size() > 0){%>
	<table border="1">
	<tr><th>和名</th><th>英名</th><th>code</th><th>効果</th></tr>
	<%for(Color c:list){ %>
		<%int size=c.getEffects().length; %>
		<%for(int i=0;i<size;i++) {%>
			<tr>
			<%if(i==0) {%>
			<td rowspan="<%=size %>"><%=c.getNameJ() %></td>
			<td rowspan="<%=size %>"><%=c.getNameEn() %></td>
			<td rowspan="<%=size %>"><%=c.getCode() %></td>
			<%} %>
			<td><%=c.getEffects()[i] %></td>
			</tr>
		<%} %>
	<%} %>
</table>
<%} %>
</body>
</html>

7.以下のように表示されれば成功だ。