2017-09-21 5 views
-1

いくつかのJSONオブジェクトをJSON配列に変換しようとしています。私はmysqlデータベースからデータを取得しています。Java EEを使用してJSONオブジェクトのリストをJSON配列に変換するにはどうすればよいですか?

メインクラス::私の現在のコードは、このループを使用している

public class Main 
    { 
     ResultSet resultSet=null; 
     TestDAO testDAO = new TestDAO(); 

     public List<JSONObject> getJsonObject() 
     { 
      resultSet = testDAO.getResultSet(); 
      List<JSONObject> resList = JsonServices.getFormattedResult(resultSet); 
      return resList; 
     } 

     public JSONArray getJsonArray() throws Exception { 
      resultSet = testDAO.getResultSet(); 
      JSONArray jsonArray = new JSONArray(); 
      while (resultSet.next()) { 
       int total_rows = resultSet.getMetaData().getColumnCount(); 
       JSONObject obj = new JSONObject(); 
       for (int i = 0; i < total_rows; i++) { 
        obj.put(resultSet.getMetaData().getColumnLabel(i + 1).toLowerCase(), resultSet.getObject(i + 1)); 
       } 
       jsonArray.put(obj); 
      } 
      return jsonArray; 
     } 


     public static void main(String args[]) throws Exception 
     { 
      Main m = new Main(); 
      List<JSONObject> jObj = m.getJsonObject(); 
      JSONArray jArr = m.getJsonArray(); 

      for(int i=0;i<jArr.length();i++) 
      { 
       System.out.println(jArr.get(i)); 
      } 



     /*for(int i=0;i<jObj.size();i++) 
     { 
      System.out.println(jObj.get(i)); 
     }*/ 
    } 
} 

サービスクラス:この形式で

public class JsonServices 
{ 
    public static List<JSONObject> getFormattedResult(ResultSet rs) 
    { 
     List<JSONObject> resList = new ArrayList<JSONObject>(); 
     try 
     { 
      ResultSetMetaData rsMeta = rs.getMetaData(); 
      int columnCnt = rsMeta.getColumnCount(); 
      List<String> columnNames = new ArrayList<String>(); 

      for(int i=1;i<=columnCnt;i++) 
      { 
       columnNames.add(rsMeta.getColumnName(i).toUpperCase()); 
      } 
      while(rs.next()) 
      { 
       JSONObject obj = new JSONObject(); 
       for (int i=1;i<=columnCnt;i++) 
       { 
        String key = columnNames.get(i-1); 
        String value = rs.getString(i); 
        obj.put(key, value); 
       } 
       resList.add(obj); 
      } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      try 
      { 
       rs.close();    
      } 
      catch (SQLException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
     return resList; 
    } 

} 

私の現在のループ戻りデータ:私は必要

{"fineloadinmetric":"648265.32","waterlevel":"45.59","fdate":"2017-08-29","discharge":"43391.657","runinthousand":"156.771","courseloadinmetric":"50538.462","mediumloadinmetric":"176808.134","floodflag":"false"} 
{"fineloadinmetric":"856793.621","waterlevel":"44.94","fdate":"2017-08-28","discharge":"46843.674","runinthousand":"212.579","courseloadinmetric":"43957.152","mediumloadinmetric":"132528.51","floodflag":"false"} 
{"fineloadinmetric":"898789.111","waterlevel":"45.66","fdate":"2017-08-27","discharge":"43436.507","runinthousand":"159.727","courseloadinmetric":"53053.74","mediumloadinmetric":"169307.45","floodflag":"false"} 

JSON配列は次のようになります:

[{ 
     name: 'fineloadinmetric', 
     data: [648265.32, 52503, 57177, 69658, 97031, 119931, 137133, 154175] 
    }, { 
     name: 'waterlevel', 
     data: [45.59, 24064, 29742, 29851, 32490, 30282, 38121, 40434] 
    }, { 
     name: 'fdate', 
     data: [2017-08-29, 2017-08-28, 2017-08-27, 2017-08-26, 2017-08-25, 2017-08-24, 2017-08-23, 2017-08-22] 
    }, { 
     name: 'discharge', 
     data: [43391.657, null, 7988, 12169, 15112, 22452, 34400, 34227] 
    }, { 
     name: 'runinthousand', 
     data: [156.771, 5948, 8105, 11248, 8989, 11816, 18274, 18111] 
    }, { 
     name: 'courseloadinmetric', 
     data: [50538.462, 5948, 8105, 11248, 8989, 11816, 18274, 18111] 
    }, { 
     name: 'mediumloadinmetric', 
     data: [176808.134, 5948, 8105, 11248, 8989, 11816, 18274, 18111] 
    }, { 
     name: 'floodflag', 
     data: [false, true, false, true, false, false, false, true] 
    }] 

データは無視してください。別のサンプルです。 このJSON配列を使用して、Highcharts.jsを使用していくつかのチャートを作成します。

+0

私の答えにコメントして、私はサービスクラスは質問のために必要ではないと推測しますので、私はそれを削除するための編集提案を入れます。また、私の回答や他の人があなたの問題を解決した場合は、投票ボタンの下にあるチェックマークアイコンを使用して問題を解決するようにマークすることができます。 – Haem

答えて

0

返すオブジェクトの種類を調べると、まずMap<String,JSONArray>に「データ」配列が設定されます。だから、あなたは現在、今、この

Map<String,JSONArray> map=new HashMap<>(); 
for(int i=0;i<jArr.length();i++){ 
    JSONObject object=(JSONObject)jArr.get(i); 
    for(Iterator<String> it=object.keys();it.hasNext();){ 
    String key=it.next(); 
    if(!map.containsKey(key)){//This initializes the array on first element 
     map.put(key, new JSONArray()); 
    } 
    //This fetches the array corresponding to the member's name from the map 
    JSONArray array=map.get(key); 
    //put the member's value into the array 
    array.put(object.get(key)); 
    } 
} 

で得た出力を反復処理、mapのエントリーセットはかなりあなたが投稿所望の出力のように見えます。唯一のことはやって左にあなたがのために、各ループを反復処理することができSet<Entry<String,JSONArray>を返しmap.entrySet()で設定mapのエントリを取得、これを行うにはJSONArray

に設定され、そのエントリを変換することです。エントリのgetKey()を呼び出すとStringの要素マップが返され、nameにはJSONObjectのようになります。エントリのgetValue()を呼び出すと、ループによって構築されたJSONArrayが返され、dataになります。これらのオブジェクトをJSONArrayに追加すると、探しているものが得られます。

+0

申し訳ありませんが、もう少し説明していただけますか? – spaul

+0

@ spaulもう少し詳しく説明しました。 – Haem

+0

ありがとうございます。ここで使用される変数currentResultは何ですか? – spaul

関連する問題