【Java】JSONデータをインプット/アウトプットする

■概要

以下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)

開始
開始
開始メッセージ出力
開始メッセージ出力
実行引数
実行引数
output
output
jsonデータ出力処理
jsonデータ出力処理
jsonデータ入力処理
jsonデータ入力処理
エラー出力
エラー出力
終了
終了
input
input
その他
その他
Text is not SVG – cannot display

・JSONファイル読み込みクラス(InputJsonData.java)

開始
開始
Jsonファイル読込
Jsonファイル読込
Jsonの各要素取得
Jsonの各要素取得
MAPにJsonデータセット
MAPにJsonデータセット
Jsonファイル
Jsonファイル
MAPの要素数分繰り返し
MAPの要素数分繰り返し
Jsonデータ出力
Jsonデータ出力
終了
終了
Text is not SVG – cannot display

・JSONデータ作成&出力クラス(OutputJsonData.java)

開始
開始
ユーザデータクラス
インスタンス
ユーザデータクラス インスタンス
各ユーザデータをセット
各ユーザデータをセット
Json形式に成形して出力
Json形式に成形して出力
終了
終了
Text is not SVG – cannot display

■サンプルデータ

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操作

タイトルとURLをコピーしました