JavaでJSONファイルのエンコード、デコードをする
Javaを使ってJSONの操作を行った記録です。JSONは汎用的なテキストデータフォーマットで、JavaScriptのオブジェクト表記構文が元になっています。JavaScriptはもちろん、他の色々なプログラミング言語で利用できるように各言語でメソッドなどが用意されています。PHPでは標準の関数にjson_encode(), json_decode()がありますが、Javaには標準で使えるメソッドはなさそうな感じでしたが、MavenリポジトリにJSONを扱うためのライブラリがいくつかあります。ググると”json in Java”, “Jackson”, “gson”, “javax.json”あたりがヒットしましたが、本記事ではその中の javax.json を利用します。またIDE環境ではなくコマンドラインでコンパイルします。
目次 Table of Contents
Mavenリポジトリから javax.json をダウンロード、クラスパスを通す
以下リポジトリからjarファイルをダウンロードします。
org.glassfish/javax.json
javax.json/javax.json-api
そのままファイルをダウンロードするか、mvnコマンドでダウンロードしてください。
mvn dependency:get -Dartifact=org.glassfish:javax.json:1.1.4 -Ddest=./
mvn dependency:get -Dartifact=javax.json:javax.json-api:1.1.4 -Ddest=./
javax.json はapiのjarファイルとデフォルトプロバイダーのjarの両方が必要みたいです。上記コマンドはjarファイルをカレントディレクトリにダウンロードしています。
一括管理のライブラリ用ディレクトリであればコンパイル時と実行時にそちらにクラスパスを通します。メインクラスと同一ディレクトリにjarファイルがある場合は、以下のコマンドでコンパイル・実行します。
【Windows】
javac -cp C:\aaa\javax.json-api-1.1.4.jar;C:\aaa\javax.json-1.1.4.jar -encoding UTF-8 SampleJson.java
java C:\aaa\javax.json-api-1.1.4.jar;C:\aaa\javax.json-1.1.4.jar SampleJson
【Linux】
javac -cp ‘.:*’ -encoding UTF-8 SampleJson.java
java ‘.:*’ SampleJson
Windowsで複数のjarファイルにクラスパスを通す場合、パスをセミコロンで区切ります。Linuxの場合はパスをコロンで区切る、とありましたがうまくいきませんでした。代わりにJava6から使用可能なクラスパス・ワイルドカードを使ったコマンドにしました。アスタリスクは”jar, JAR”を表し、シングルクオートで囲むことでjarが展開されずにJavaに引き渡されます。ドットはカレントディレクトリを表します。ってかコマンドラインでjavac打つ原始人なんていないかもしれませんが。長いのでバッチかシェルで。
javax.jsonを使ったJSON基本操作
javax.json パッケージを使ったJSONの基本操作です。
【JSONオブジェクトを作成する】
/*
{
“name”: “ryoma”,
“description”: “Hello Json”
}
*/
JsonObject jsonObject = Json.createObjectBuilder()
.add(“name”, “ryoma”)
.add(“description”, “Hello Json”)
.build();
System.out.println(“jsonObject” + jsonObject);
【JSON文字列からJSONオブジェクトを作成する】
String jsonStr2 = “{\”name\”:\”apple\”,\”price\”:\”150\”}”;
JsonReader jsonReader = Json.createReader(new StringReader(jsonStr2));
JsonObject jsonObject2 = jsonReader.readObject();
System.out.println(“jsonObject2 : ” + jsonObject2);
【JSON配列文字列をJSON配列オブジェクトに変換する】
String jsonStr3 = “[1,\”apple\”,true,\”200\”]”;
JsonReader jsonReader2 = Json.createReader(new StringReader(jsonStr3));
JsonArray jsonArray2 = jsonReader2.readArray();
System.out.println(“jsonArray2 : ” + jsonArray2);
【JSON配列の要素を取得する】
//[1,\”apple\”,true,\”200\”]
//JsonValueクラスにはgetValueType()があり型を判別できる
JsonValue value = jsonArray2.get(1);
System.out.println(value);
for(int i = 0; i < jsonArray2.size(); i++){
System.out.println(jsonArray2.get(i));
System.out.println(jsonArray2.get(i).getValueType());
}
//下記メソッドを使った方法だと値の型が異なるときにClassCastExceptionが発生するので上記がおすすめ
Integer valueInteger = jsonArray2.getJsonNumber(0).intValue();
System.out.println(“valueInteger : ” + valueInteger);
String valueString = jsonArray2.getJsonString(1).getString();
System.out.println(“valueString : ” + valueString);
【JSONオブジェクトの要素を取得する】
/*
{
“name”: “ryoma”,
“description”: “Hello Json”
}
取得する型ごとにメソッドがある。
インタフェースjavax.json.JsonStructureからgetVelue(int index)を継承しているが、
JsonObjectに対して使ってもnullが返ってきた。
*/
String valueString2 = jsonObject.getJsonString(“description”).getString();
System.out.println(“valueString2 : ” + valueString2);
【JSONファイルからJSONオブジェクトを作成】
try{
Reader reader = new InputStreamReader(new FileInputStream(“sampleJson.json”));
JsonReader jsonReader4 = Json.createReader(reader);
JsonObject jsonObject4 = jsonReader4.readObject();
System.out.println(“jsonObject4 : ” + jsonObject4);
} catch(FileNotFoundException e){
//省略
}
【ネストされたJSONオブジェクト】
/*
{
“name”: “ryoma”,
“description”: “Hello Java”,
“object”: {
“sex”: “male”,
“favorite”: “programming”,
“language”: {
“1”: “java”,
“2”: “C#”,
“3”: “JavaScript”,
“4”: “PHP”
}
}
}
*/
try{
Reader reader = new InputStreamReader(new FileInputStream(“sampleJson2.json”));
JsonReader jsonReader5 = Json.createReader(reader);
JsonObject jsonObject5 = jsonReader5.readObject();
System.out.println(“jsonObject5 : ” + jsonObject5);
JsonValue value2 = jsonObject5.getJsonObject(“object”);
System.out.println(“value2.getValueType() : ” + value2.getValueType()); //OBJECT
JsonObject jsonObject6 = (JsonObject)value2;
String valueString3 = jsonObject6.getJsonString(“favorite”).getString();
System.out.println(“valueString3 : ” + valueString3); //prigramming
} catch(FileNotFoundException e){
//省略
}