前提・実現したいこと
Java初心者です。
カンマ区切りの文字列として受け取ったデータを配列に変換後、
配列をObject型に格納、その後の取り出し方がわかりません。
配列で取り出す方法がないか、ご教授お願いします。
データ
| id | name | list |
|---|---|---|
| 0 | taro | AAA,BBB,CCC |
| 1 | hanako | DDD,EEE,FFF |
該当のソースコード
java
1// DBから上記の値を取得 2public List<Map<String, Object>> getList() throws SQLException { 3 HashMap<String, String> parameterMap = new HashMap<>(); 4 try (PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM table")) { 5 try (ResultSet resultSet = preparedStatement.executeQuery()) { 6 ArrayList<Map<String, Object>> list = new ArrayList<>(); 7 while(resultSet.next()) { 8 list.add(setResultSetToMap(resultSet)); 9 } 10 return list; 11 } 12 } 13} 14//Listを代入 15List<Map<String, Object>> List = getList(); 16 17// 他のデータと整合するために、map化 18Map<String, JSONObject> ObjectMap= new HashMap<>(); 19for(Map<String, Object> map : List) { 20 JSONObject Object = new JSONObject(); 21 Object.put("id", map.get("id")); 22 Object.put("name", map.get("name")); 23 if(map.get("list") != null) { 24 String string = (String)map.get("list"); 25 // ここでカンマ区切りのリストに変換 26 List<String> list = Arrays.asList(string.split(",")); 27 Object.put("list", list); 28 } 29 ObjectMap.put(Object.getString("id"), Object); 30} 31 32// 別のデータと整合(内容は省略) 33List<JSONObject> outputObjectList = new ArrayList<>(); 34for(略){ //リスト数文ループ 35 JSONObject jsonObject = null; 36 jsonObject = ObjectMap.get(id); //上記の内容を丸ごと移行 37 jsonObject.put("address", "〇〇県"); 38 outputObjectList.add(jsonObject); 39} 40 41// 取り出し 42for (JSONObject obj : outputObjectList) { 43 44 // listを配列で受け取りたい 45 // ↓↓ここが不明↓↓ 46 List<String> list = obj.get("list"); // ※1 47 48 //この後配列を使いたい。。。 49 for (int j = 0; j < list .length(); ++ j) {...} 50 51} 52
試したこと
※1の部分でobj.get("list")の型が知りたかったので、以下四つを試し、
- if (obj.get("list") instanceof Object)
- if (obj.get("list") instanceof String)
- if (obj.get("list") instanceof JSONObject)
- if (obj.get("list") instanceof List)
Object,Listの場合Trueが返されたので、List<String>型で受け取れるはず、と※1のように記載しましたが
記述の時点で「型の不一致: Object から List<String> には変換できません」と警告がでてしまいました。
型の不一致のため、キャストする方法に変更しましたが、以下の通り記載すると、
「Objectから List<Object> への未検査キャスト」と警告表示されます。
- List<String> list = (List<String>) obj.get("list");
また、ほかの配列(JSONArray)で受けられるかと思い、以下のようにしましたが、
実行時に型が違います、とエラー表示されます。
- JSONArray list = obj.getJSONArray("list");
補足情報(FW/ツールのバージョンなど)
カンマ区切りのテキストはただのString
そもそもこれ、javaではない気がする。
> instanceofを試して「Object型」「List型」でtrueでしたがList<String>では受けられませんでした。
起きている事象を正確に書いてください。何をもって「List<String>では受けられなかった」と判断したのですか?
>asahina1979 さん
>カンマ区切りのテキストはただのString
配列でObjectに入れたつもりでしたが、配列で格納されていない、とのことでしょうか?
> swordone さん
分かりづらかったので、質問のほう編集しました。
List<String>に対象のデータを入れようとして、型の不一致が出てしまったため、List<String>では受けられないと判断しました。
最初のList = []; の代入自体が文法的に成立していません(どのような値が実際に作られているのか、質問者以外には不明です)。
Javaとして動作するように書き直してください。
> maisumakunさん
すみません、内容を省略しすぎてました。(Javaでない、の意味が理解できました。)
DBから受け取った値をgetList()の関数で格納しています。
JSONObjectはorg.json.JSONObjectで間違いないですか?
(Androidか普通のJavaか、どちらでしょうか)
> maisumakunさん
org.json.JSONObjectです。普通のJavaになります。