質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1084閲覧

JavaでCSVファイルを取得して、Mapを使用してデータをJSON形式にしたい。

asuka.Mir

総合スコア15

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

0クリップ

投稿2022/12/26 13:30

編集2022/12/28 22:59

前提

※この質問は以前の「JavaでCSVファイルを取得して、データをJSON形式にしたい。」の続きになります。
https://teratail.com/questions/8yn8kh5e81l8y5

Javaの勉強でCSVファイルを取得してそのファイル内のデータをJSON形式にするプログラム作っています。
しかし、【想定のJSON形式】のようにうまくいきません。。
想定通りに作成するにはどのように修正すればよろしいでしょうか。
お手数ですが、ご協力をお願いいたします。

課題

・現状DataList としたいところがnullになっていまう。
→現状の結果に記載の{null=[」は{”DataList”:[ としたい。

・以下のように設定したい
キー:"DataList"(リスト文字列)
キー:"ID"(文字列) 値:文字列
キー:"Name"(文字列) 値:文字列
キー:"Type"(文字列) 値:文字列
キー:"Level"(文字列) 値:数値
→特にLevelだけ上記のように設定する方法が分からない。

CSVファイルの中身と想定のJSON形式

【Zukan.csv】
ID Name Type Level
1 ニャオハ 草 5
2 クワッス 水 6
3 ホゲータ 炎 10
4 パモ 電気 1
5 グルトン 無 3

【想定のJSON形式】

{ "DataList": [ { "ID": "001", "Name": "ニャオハ", "Type": "草", "Level": 5 }, { "ID": "002", "Name": "クワッス", "Type": "水", "Level": 6 }, { "ID": "003", "Name": "ホゲータ", "Type": "炎", "Level": 10 }, { "ID": "004", "Name": "パモ", "Type": "電気", "Level": 1 }, { "ID": "005", "Name": "グルトン", "Type": "無", "Level": 3 } ] }

現状の結果

{null=[["ID","Name","Type","Level"],["1","ニャオハ","草","5"],["2","クワッス","水","6"],["3","ホゲータ","炎","10"],["4","パモ","電気","1"],["5","グルトン","無","3"]]}

該当のソースコード

Java

1import java.util.List; 2 3public class ZukanData { 4//Json形式の設定クラス 5 public static List<DataList> dataList; 6 7 public class DataList { 8 9 String id; 10 11 String name; 12 13 String Type; 14 15 int Level; 16 17 } 18 19}

Java

1import java.io.BufferedReader; 2import java.io.File; 3import java.io.FileReader; 4import java.nio.file.Path; 5import java.nio.file.Paths; 6import java.util.ArrayList; 7import java.util.HashMap; 8import java.util.List; 9import java.util.Map; 10 11import com.fasterxml.jackson.databind.ObjectMapper; 12 13public class CsvtoJsonSample { 14 private static List<DataList> DataList; 15 16 public static void main(String[] args) { 17 Path csvPash = Paths.get("C:\\Zukan.csv"); 18 BufferedReader br = null; 19 String json = null; 20 // データを格納するリスト 21 List<String[]> data = new ArrayList<String[]>(); 22 23 Map<List<DataList>, String> map = new HashMap<>(); 24 String mapJson = null; 25 26 try { 27 File file = new File(csvPash.toString()); 28 29 br = new BufferedReader(new FileReader(file)); 30 ObjectMapper mapper = new ObjectMapper(); 31 // readLineで一行ずつ読み込む 32 String line; 33 while ((line = br.readLine()) != null) { 34 // lineをカンマで分割し、配列リストdataに追加 35 data.add(line.split(",")); 36 } 37 System.out.println(data); 38 json = mapper.writeValueAsString(data); 39 System.out.println(json); //[["ID","Name","Type","Level"],["1","ニャオハ","草","5"],["2","クワッス","水","6"],["3","ホゲータ","炎","10"],["4","パモ","電気","1"],["5","グルトン","無","3"]] 40 map.put(DataList, json); 41 System.out.println(map); //{null=[["ID","Name","Type","Level"],["1","ニャオハ","草","5"],["2","クワッス","水","6"],["3","ホゲータ","炎","10"],["4","パモ","電気","1"],["5","グルトン","無","3"]]} 42 mapJson = mapper.writeValueAsString(map); 43 System.out.println(mapJson); 44 45 } catch (Exception e) { 46 } 47 } 48}
TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/12/26 13:58

> Javaの勉強でCSVファイルを取得してそのファイル内のデータをJSON形式にするプログラム作っています。 その目的は何ですか? CSV ファイルに必要なデータがあるなら CSV ファイルから取得して使えば済む話で、それをわざわざ JSON にする意味はないと思うのですが?
asuka.Mir

2022/12/28 23:04

Javaのjacksonライブラリを使用してCSVデータからJSONデータに変換するという処理を少し実践的に勉強したかったためでした。質問ありがとうございます。
guest

回答2

0

ベストアンサー

JavaでCSVファイルを取得して、データをJSON形式にしたい。part2

「part2」と言われてもこの質問だけ見た人には意味が分からないので、「part1」のリンクも含めてください。
JavaでCSVファイルを取得して、データをJSON形式にしたい。

xebmeさんらのコメントに回答して頂けていたら、前回の質問で解決できていたような気もします。
コメントはいちゃもんをつけているのではなく、不明確な部分の確認・より良い方法の提案等、回答する気があるから聞いていることがほとんどです。
的確な回答を期待するなら、質問者も誠実な対応をお願いします。


JSONで{}は、「オブジェクト(順序づけされていないキーと値のペアの集まり)」です。
キーと値のペアが0個以上あります。
(Javaで言うと)Mapもそうですし、クラスをシリアライズしてもこちらになります。

JSONで[]は、「配列(データのシーケンス)」です。
0個以上の「何か」の集まりです。
(Javaで言うと)文字列の配列かもしれないし、オブジェクトのListかもしれません。
JavaScript Object Notation - Wikipedia

「想定のJSON形式」は、

  1. 一番外が{で始まるのでオブジェクト
  2. その中のDataListというキーの値は[で始まるので配列
  3. さらにその中の「何か」は{で始まるのでオブジェクト

ということになり、Map<String, List<DataList>>です(全体をクラスにしてもいいが)

Java

1import com.fasterxml.jackson.databind.ObjectMapper; 2 3import java.io.IOException; 4import java.nio.file.*; 5import java.util.*; 6 7 8public class CsvtoJsonSample { 9 private static List<Pokemon> pokemonList; 10 11 public static void main(String[] args) throws IOException { 12 var csvPash = Paths.get("Zukan.csv"); 13// dummy(csvPash); 14 15 pokemonList = new ArrayList<>(); 16 17 // [Java8にもなったんだからFiles使おう - Qiita](https://qiita.com/nishemon/items/a96cb6e14161f3ca8ee4) 18 try (var br = Files.newBufferedReader(csvPash)) { 19 String line = br.readLine(); // ヘッダー読み飛ばし 20 21 while ((line = br.readLine()) != null) { 22 var array = line.split(","); 23 24 var pokemon = new Pokemon(); 25 pokemon.ID = String.format("%3s", array[0].trim()).replace(" ", "0"); // 0埋め 26 pokemon.Name = array[1]; 27 pokemon.Type = array[2]; 28 pokemon.Level = Integer.parseInt(array[3]); 29 30 pokemonList.add(pokemon); 31 } 32 33 var zukanData = new HashMap<String, List<Pokemon>>(); 34 zukanData.put("DataList", pokemonList); 35 36 // 大外もクラスを使うなら 37// var zukanData = new ZukanData(); 38// zukanData.DataList = pokemonList; 39 40 var mapper = new ObjectMapper(); 41 var json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(zukanData); 42 System.out.println(json); 43 } catch (Exception e) { 44 // 例外を握りつぶさないでください!! 45 // printStackTraceするか、throws句を使ってください。 46 // ファイルが開けなかったのか・想定カラムがなかったのか・parseIntできなかったのか等々 47 // 想定通りにならないときに原因がわかりません。 48 e.printStackTrace(); 49 } 50 } 51 52// private static void dummy(Path csvPash) throws IOException { 53// var csv = """ 54// ID,Name,Type,Level 55// 1,ニャオハ,草,5 56// 2,クワッス,水,6 57// 3,ホゲータ,炎,10 58// 4,パモ,電気,1 59// 5,グルトン,無,3"""; 60// Files.writeString(csvPash, csv); 61// } 62} 63 64class Pokemon { 65 public String ID; 66 public String Name; 67 public String Type; 68 public int Level; 69} 70 71class ZukanData { 72 public List<Pokemon> DataList; 73}

json

1{ 2 "DataList" : [ { 3 "ID" : "001", 4 "Name" : "ニャオハ", 5 "Type" : "草", 6 "Level" : 5 7 }, { 8 "ID" : "002", 9 "Name" : "クワッス", 10 "Type" : "水", 11 "Level" : 6 12 }, { 13 "ID" : "003", 14 "Name" : "ホゲータ", 15 "Type" : "炎", 16 "Level" : 10 17 }, { 18 "ID" : "004", 19 "Name" : "パモ", 20 "Type" : "電気", 21 "Level" : 1 22 }, { 23 "ID" : "005", 24 "Name" : "グルトン", 25 "Type" : "無", 26 "Level" : 3 27 } ] 28}

投稿2022/12/26 21:28

TN8001

総合スコア9326

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asuka.Mir

2022/12/28 23:01

回答者に不適切な質問をしていしまい申し訳ございません。 前回からの非常に丁寧な指摘と回答大変感謝しております。 ありがとうございました。
guest

0

Zukan.csv

csv

1ID,Name,Type,Level 21,ニャオハ,草,5 32,クワッス,水,6 43,ホゲータ,炎,10 54,パモ,電気,1 65,グルトン,無,3

CsvToJsonSample.java

java

1import java.io.File; 2import java.io.FileReader; 3import java.io.BufferedReader; 4import java.io.IOException; 5import java.util.ArrayList; 6import java.util.LinkedHashMap; 7import com.fasterxml.jackson.databind.ObjectMapper; 8import com.fasterxml.jackson.databind.SerializationFeature; 9 10public class CsvToJsonSample { 11 public static void main(String[] args) { 12 try { 13 File csv = new File("Zukan.csv"); 14 BufferedReader br = new BufferedReader(new FileReader(csv)); 15 16 ArrayList<String[]> data = new ArrayList<>(); 17 String line; 18 while ((line = br.readLine()) != null) { 19 // 文字列中にカンマは含まれていない前提とする 20 // Java でカンマを含む CSV データを扱う場合はライブラリを用いる必要がある 21 data.add(line.split(",")); 22 } 23 br.close(); 24 25 ArrayList<Object> resultList = new ArrayList<>(); 26 String[] header = data.remove(0); 27 int columnSize = header.length; 28 for (String[] row: data) { 29 LinkedHashMap<String, Object> map = new LinkedHashMap<>(); 30 for (int i = 0; i < columnSize; ++i) { 31 String heading = header[i]; 32 Object value = row[i]; 33 if (heading.equals("ID")) value = String.format("%03d", Integer.parseInt(row[i])); 34 if (heading.equals("Level")) value = Integer.parseInt(row[i]); 35 map.put(heading, value); 36 } 37 resultList.add(map); 38 } 39 40 LinkedHashMap<String, Object> resultData = new LinkedHashMap<>(); 41 resultData.put("DataList", resultList); 42 43 ObjectMapper mapper = new ObjectMapper(); 44 mapper.enable(SerializationFeature.INDENT_OUTPUT); 45 String json = mapper.writeValueAsString(resultData); 46 System.out.println(json); 47 } catch (IOException e) { 48 System.out.println(e); 49 } 50 } 51}

Output

json

1{ 2 "DataList" : [ { 3 "ID" : "001", 4 "Name" : "ニャオハ", 5 "Type" : "草", 6 "Level" : 5 7 }, { 8 "ID" : "002", 9 "Name" : "クワッス", 10 "Type" : "水", 11 "Level" : 6 12 }, { 13 "ID" : "003", 14 "Name" : "ホゲータ", 15 "Type" : "炎", 16 "Level" : 10 17 }, { 18 "ID" : "004", 19 "Name" : "パモ", 20 "Type" : "電気", 21 "Level" : 1 22 }, { 23 "ID" : "005", 24 "Name" : "グルトン", 25 "Type" : "無", 26 "Level" : 3 27 } ] 28}

投稿2022/12/26 17:16

arcxor

総合スコア2859

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問