【Bukkit Plugin開発】 JSONを扱う

これは Adventar: Bukkit Plugin開発 Advent Calendar 2015 参加記事です。
他の記事もぜひご覧ください。

今回はJSONについてやります。

JSONとは

JSONとは、JavaScriptのオブジェクトの表記法を応用した軽量なデータ記述言語の1つ。
JSONでは、データ全体を配列またはJavaScriptにおけるオブジェクト(キーと値のペアを列挙した構造体)として記述。
値として利用できるデータ型は整数型、浮動小数点数型、文字列型、ブール型(真偽値)、null(値無し)、配列、オブジェクト。

2006年7月にRFC 4627で仕様が規定。
MIMEタイプはapplication/json、拡張子はjson。

利用はJavaScriptでのみならず、その単純さゆえ、様々な言語で簡単に扱うことができるので、プログラム間のデータの受け渡しに頻繁に利用されている。
代表例がWebAPIなどである。

実際にBukkitPlugin(Java)でJSONを扱う

Bukkit Plugin の動作環境ではすでに json-simple が使えるようになっており、

<br />
String jsonStr = '{&quot;a&quot;: &quot;b&quot;, &quot;c&quot;: [&quot;d&quot;, &quot;e&quot;]}';<br />
JSONObject jsonObject = (JSONObject) new JSONParser().parse(jsonStr);<br />
// jsonObject.get(&quot;a&quot;) -&gt; b</p>
<p>JSONArray array = (JSONArray) jsonObject.get(&quot;c&quot;);<br />
// array.get(0) -&gt; d<br />

だけでパースされて使えるようになる。

昨日のサンプルを改良してみる

昨日の記事の郵便番号から住所に変換するプラグインを改造してみましょう。

下のように修正します。

<br />
package net.yk_lab.bukkit.zipcode2addressplugin;</p>
<p>import java.net.MalformedURLException;</p>
<p>import org.bukkit.entity.Player;<br />
import org.json.simple.JSONArray;<br />
import org.json.simple.JSONObject;<br />
import org.json.simple.parser.JSONParser;<br />
import org.json.simple.parser.ParseException;</p>
<p>public class Zip2Addr extends HttpGetClient {<br />
	private Player player;</p>
<p>	public Zip2Addr(String url, Player player) throws MalformedURLException {<br />
		super(url);<br />
		this.player = player;<br />
	}</p>
<p>	@Override<br />
	protected void run(String res) {<br />
		try {<br />
			JSONObject jsonObject = (JSONObject) new JSONParser().parse(res);<br />
			if(jsonObject.get(&quot;status&quot;).equals((Long) 200L)){<br />
				JSONArray result = (JSONArray) jsonObject.get(&quot;results&quot;);<br />
				for (int i = 0; i &lt; result.size(); i++) {<br />
					player.sendMessage(<br />
							&quot;住所&quot; + i+1 +&quot;: &quot;<br />
									+ ((JSONObject)result.get(i)).get(&quot;address1&quot;)<br />
									+ ((JSONObject)result.get(i)).get(&quot;address2&quot;)<br />
									+ ((JSONObject)result.get(i)).get(&quot;address3&quot;)<br />
							);<br />
					player.sendMessage(<br />
							&quot;読み&quot; + i+1 +&quot;: &quot;<br />
									+ ((JSONObject)result.get(i)).get(&quot;kana1&quot;)<br />
									+ ((JSONObject)result.get(i)).get(&quot;kana2&quot;)<br />
									+ ((JSONObject)result.get(i)).get(&quot;kana3&quot;)<br />
							);<br />
				}<br />
			}<br />
			else if(jsonObject.get(&quot;status&quot;).equals((Long) 400L)){<br />
				player.sendMessage(&quot;パラメータエラー: &quot; + jsonObject.get(&quot;message&quot;));<br />
			}<br />
			else if(jsonObject.get(&quot;status&quot;).equals((Long) 500L)){<br />
				player.sendMessage(&quot;サーバーでエラーが発生しました。(&quot; + jsonObject.get(&quot;message&quot;) +&quot;)&quot;);<br />
			}<br />
			else {<br />
				player.sendMessage(&quot;不明なエラー&quot;);<br />
			}<br />
		} catch (ParseException e) {<br />
			player.sendMessage(e.getLocalizedMessage());<br />
		}<br />
	}</p>
<p>}<br />

実行結果

Zipcode2Address実行結果

仕様

API側の仕様はzipcloudから確認してください。

このプログラムの仕様としては該当する住所が一つしかなくても番号が表示されたり、存在しない郵便番号を入れるとプラグイン側のエラーとなり終了します(たぶん)。
その辺りはぜひ修正してみてください(無責任)。

まとめ

簡単にできましたね!
ただこれだけです!
フォーマットなどが気になったら各自検索してみてください。JSONはしっかり日本語でいろいろな情報が出ています!

次回は何やりますかね?(割とまじで)
とりあえずMetadataについてやる予定です。
それではノシ

コメント
トラックバック
ページトップへ