読者です 読者をやめる 読者になる 読者になる

感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

リクエストされたJSONをJavaサーブレット側でJSONICを使って解析し、クラスに詰め込むサンプル

<スポンサーリンク>

※2014/11/15追記※

JSONICのREST Servletを使ってJsonレスポンスを返すサンプルは以下の記事に書きました。
JSONICのREST Servletを使って,JavaオブジェクトをJSONにしてレスポンスを返す。

JSONICでPOSTリクエストのパラメータを取得する
別のブログですが、よかったら参考にしてください。

※追記ここまで※

JSONICについて

サーブレットでStringとして受け取ったJSONをパースするには、JSONICを使う。
JSONICのjarは以下でダウンロードできる。
http://jsonic.sourceforge.jp/

クライアントから送られてきた(リクエストされた)JSONをJavaサーブレットで解析する

ダウンロードしたjarをビルドパスに通し、使えるようにする。
前回の記事でJavaScriptのオブジェクトをJSONに変換した。
以下のURLを参照してほしい。
http://d.hatena.ne.jp/sho322/20130830/1377818605

リクエストで投げるJSONは以下の通り。

{"name":"sho322","age":28,"interests":["programming","basketball"]} 

まず最初に、Java側では、上記のJSONに対応するBeanクラスを作る。

package model;

public class PersonBean {
	private String name;
	private int age;
	private String[] interests;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String[] getInterests() {
		return interests;
	}
	public void setInterests(String[] interests) {
		this.interests = interests;
	}

}

こんな感じ。
こういう対応するBeanを作れば、JSONICがjsonをこのBeanクラスに対応させて変換して格納してくれる。
JSONの配列はString[]に対応する。

サーブレットのコードはこうなる。

package controller;

import java.io.IOException;
import java.io.PrintWriter;

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

import model.PersonBean;
import net.arnx.jsonic.JSON;

public class ControllerServlet extends HttpServlet{
	public void doPost(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		req.setCharacterEncoding("utf-8");
		res.setContentType("application/json; charset=utf-8");
		String jsonFromClient = req.getParameter("json");
		PersonBean bean = JSON.decode(jsonFromClient, PersonBean.class);

		System.out.println("サーバで取得した名前は:" + bean.getName());
		System.out.println("サーバで取得した年齢は:" + bean.getAge());
		System.out.println("サーバで取得した趣味は:" + bean.getInterests()[0] + "," + bean.getInterests()[1]);

		bean.setName("前田太尊");
		bean.setAge(27);
		String[] interests = {"合コン","飲み会"};
		bean.setInterests(interests);

		String jsonText = JSON.encode(bean);

		PrintWriter out = res.getWriter();
		out.println(jsonText);

	}
}

jsonを受け取って、JSONICでクラスに変換しているのは以下の部分。

String jsonFromClient = req.getParameter("json");
PersonBean bean = JSON.decode(jsonFromClient, PersonBean.class);

で、コンソールにbeanに設定された値を出力するようにしたので、以下のように出力される。

サーバで取得した名前は:sho322
サーバで取得した年齢は:28
サーバで取得した趣味は:programming,basketbal

最後に、サーバー側からJSONにエンコードしたJavaScriptオブジェクトをクライアントに返しているのが以下の部分。

String jsonText = JSON.encode(bean);
PrintWriter out = res.getWriter();
out.println(jsonText);

JSONをpostでリクエストするクライアント側のプログラムは以下のようになっていて、サーバからのレスポンスを受けて、ブラウザには、

前田太尊:27:合コン
飲み会

と表示される。
クライアント側のプログラムは以下の通り。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>TEST PROJECT</title>
<script type="text/javascript" src="js/jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="js/jquery.json-2.4.js"></script>
<script type="text/javascript">
$(function() {
    var someObj = {
            name : 'sho322',
            age  : 28,
            interests : ['programming','basketball']
        };

    $("#convert").click(function() {
    	jsonObj = $.toJSON(someObj);
    	console.log(jsonObj);
        $.post("/test_project/controller",{json : jsonObj},function(res) {
        	console.log(res);
        	var responsePerson = res
            $('#result').text(responsePerson.name + ":" + responsePerson.age + ":" + responsePerson.interests[0]);
        	$('#result').append('<div>');
        	$('#result').append(responsePerson.interests[1]);
        })
    });

});
</script>
</head>
<body>
<h2>JavaScriptオブジェクトをJSONに変換します</h2>
<input type="button" id="convert"  value="オブジェクトを変換!">
<div id="result"></div>
</body>
</html>