■概要
以下2種類の処理を実装する。
- インプット:JSONデータを読み込みMAPに格納して出力する処理
- アウトプット:任意の引数から、JSONデータを作成する処理
■特記事項
- mvnプロジェクトで作成する
- JSONの処理はjacsonを使用するため、pom.xmlでjacsonを取得する
▼パッケージの構成
作成するJavaモジュールのパッケージ構成は以下の通り。(抜粋)
.
├── data
│ └── inputdata.json
├── pom.xml
├── src
│ ├── main
│ │ └── java
│ │ └── com
│ │ └── iojsondata
│ │ ├── InputJsonData.java
│ │ ├── IoJsonDataMain.java
│ │ ├── OutputJsonData.java
│ │ ├── UserData.java
│ │ ├── UserSubData1.java
│ │ └── UserSubData2.java
▼pom.xmlの設定
JSON処理を操作するため、以下の情報をpom.xmlに追加する。
・pom.xml(抜粋)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
■フローチャート
フローチャートを以下に示す。
・メイン処理(IoJsonDataMain.java)
・JSONファイル読み込みクラス(InputJsonData.java)
・JSONデータ作成&出力クラス(OutputJsonData.java)
■サンプルデータ
JSONファイル読み込み処理にて使用するJSONファイルは以下のものを使用する。
・inputdata.json
{
"id" : "002",
"user_name" : "huga huga",
"age" : 30,
"subdata1":{
"subdata1-1":123,
"subdata1-2":456
},
"subdata2":[
{"subdata2-1":"ABC", "subdata2-2":"abc"},
{"subdata2-1":"DEF", "subdata2-2":"def"},
{"subdata2-1":"GHI", "subdata2-2":"ghi"}
]
}
■サンプルコード
・メイン処理(IoJsonDataMain.java)
package com.iojsondata;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonProcessingException;
public class IoJsonDataMain {
public static void main(String[] args) throws JsonProcessingException, IOException {
System.out.println("----- JSONデータ入出力処理 -----");
if("output".equals(args[0])) {
// jsonデータ出力処理
OutputJsonData ojd = new OutputJsonData();
ojd.output_json_data();
}else if("input".equals(args[0])) {
// jsonデータ入力処理
InputJsonData ijd = new InputJsonData();
ijd.input_json_data();
}else {
System.out.println("第一実行引数は「output」もしくは「input」を入力してください");
}
}
}
・ユーザデータクラス(UserData.java)
package com.iojsondata;
import java.util.List;
// ユーザデータクラス
public class UserData {
public String id; // ユーザID
public String user_name; // ユーザ名
public int age; // 年齢
public UserSubData1 subdata1; // サブデータ1
public List<UserSubData2> subdata2; // サブデータ2
}
・ユーザサブデータクラス1(UserSubData1.java)
package com.iojsondata;
public class UserSubData1 {
public int subdata1_1; // サブデータ1-1
public int subdata1_2; // サブデータ1-2
}
・ユーザサブデータクラス2(UserSubData2.java)
package com.iojsondata;
public class UserSubData2 {
public String subdata2_1; //サブデータ2-1
public String subdata2_2; //サブデータ2-2
}
・JSONファイル読み込みクラス(InputJsonData.java)
package com.iojsondata;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
// JSONファイル読み込みクラス
public class InputJsonData {
// JSONファイル読み込み処理
public void input_json_data() throws JsonProcessingException, IOException{
ObjectMapper om = new ObjectMapper();
// JSONファイル読み込み
JsonNode json_data = om.readTree(Paths.get("./data/inputdata.json").toFile());
// JSONの各要素取得
String id = json_data.get("id").textValue();
String name = json_data.get("user_name").textValue();
int age = json_data.get("age").intValue();
int subdata1_1 = json_data.get("subdata1").get("subdata1-1").intValue();
int subdata1_2 = json_data.get("subdata1").get("subdata1-2").intValue();
String subdata2_1_1 = json_data.get("subdata2").get(0).get("subdata2-1").textValue();
String subdata2_2_1 = json_data.get("subdata2").get(0).get("subdata2-2").textValue();
String subdata2_1_2 = json_data.get("subdata2").get(1).get("subdata2-1").textValue();
String subdata2_2_2 = json_data.get("subdata2").get(1).get("subdata2-2").textValue();
String subdata2_1_3 = json_data.get("subdata2").get(2).get("subdata2-1").textValue();
String subdata2_2_3 = json_data.get("subdata2").get(2).get("subdata2-2").textValue();
// MAPのインスタンス
Map<String, String> user_data_map = new HashMap<>();
// MAPにJSON情報を格納
user_data_map.put("id", id);
user_data_map.put("user_name", name);
user_data_map.put("age", String.valueOf(age));
user_data_map.put("subdata1-1", String.valueOf(subdata1_1));
user_data_map.put("subdata1-2", String.valueOf(subdata1_2));
user_data_map.put("subdata2-1_1", subdata2_1_1);
user_data_map.put("subdata2-2_1", subdata2_2_1);
user_data_map.put("subdata2-1_2", subdata2_1_2);
user_data_map.put("subdata2-2_2", subdata2_2_2);
user_data_map.put("subdata2-1_3", subdata2_1_3);
user_data_map.put("subdata2-2_3", subdata2_2_3);
// MAPの要素数分繰り返し
for(Map.Entry<String, String> user_data: user_data_map.entrySet()) {
// JSONのデータを出力
System.out.println(user_data.getKey() + ": " + user_data.getValue());
}
}
}
・JSONデータ作成&出力クラス(OutputJsonData.java)
package com.iojsondata;
import java.io.IOException;
import java.util.ArrayList;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
// JSONデータ作成&出力クラス
public class OutputJsonData {
// JSONデータ作成&出力処理
public void output_json_data() throws JsonProcessingException, IOException {
// ユーザデータクラスをインスタンス
UserData user_data = new UserData();
UserSubData1 user_sub_data1 = new UserSubData1();
UserSubData2 user_sub_data2_1 = new UserSubData2();
UserSubData2 user_sub_data2_2 = new UserSubData2();
UserSubData2 user_sub_data2_3 = new UserSubData2();
// ユーザデータをそれぞれセット
user_data.id = "001";
user_data.user_name = "hoge hoge";
user_data.age = 20;
user_sub_data1.subdata1_1 = 789;
user_sub_data1.subdata1_2 = 101112;
user_data.subdata1 = user_sub_data1;
user_sub_data2_1.subdata2_1 = "JKL";
user_sub_data2_1.subdata2_2 = "jkl";
user_sub_data2_2.subdata2_1 = "MNO";
user_sub_data2_2.subdata2_2 = "mno";
user_sub_data2_3.subdata2_1 = "PQR";
user_sub_data2_3.subdata2_2 = "pql";
user_data.subdata2 = new ArrayList<UserSubData2>();
user_data.subdata2.add(user_sub_data2_1);
user_data.subdata2.add(user_sub_data2_2);
user_data.subdata2.add(user_sub_data2_3);
// ユーザデータをJSON形式に整形して出力
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
String output_json_data = mapper.writeValueAsString(user_data);
System.out.println(output_json_data);
}
}
■実行結果
・実行引数:outputの場合
----- JSONデータ入出力処理 -----
{
"id" : "001",
"user_name" : "hoge hoge",
"age" : 20,
"subdata1" : {
"subdata1_1" : 789,
"subdata1_2" : 101112
},
"subdata2" : [ {
"subdata2_1" : "JKL",
"subdata2_2" : "jkl"
}, {
"subdata2_1" : "MNO",
"subdata2_2" : "mno"
}, {
"subdata2_1" : "PQR",
"subdata2_2" : "pql"
} ]
}
・実行引数:inputの場合
----- JSONデータ入出力処理 -----
subdata1-2: 456
subdata2-1_1: ABC
subdata2-2_1: abc
subdata2-1_2: DEF
user_name: huga huga
subdata1-1: 123
id: 002
subdata2-2_2: def
subdata2-1_3: GHI
subdata2-2_3: ghi
age: 30
・実行引数:aaaの場合
----- JSONデータ入出力処理 -----
第一実行引数は「output」もしくは「input」を入力してください
■参考
本処理を実装するにあたり、参考とさせていただいたページを以下に示す。
・mvnプロジェクトの作成
・JSON操作