【问题标题】:How to convert List of JSON Objects to JSON Array using Java EE?如何使用 Java EE 将 JSON 对象列表转换为 JSON 数组?
【发布时间】:2017-09-21 10:51:34
【问题描述】:

我正在尝试将一些 JSON 对象转换为 JSON 数组。我正在从 mysql 数据库中获取数据。我当前的代码正在使用这个循环:

主类:

    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 生成一些图表。

【问题讨论】:

  • 根据我的回答,我认为 Service 类对于这个问题来说不是必需的,所以我提出了一个编辑建议来删除它。此外,如果我或其他人的回答解决了您的问题,您可以使用投票按钮下方的复选标记图标将其标记为已接受。

标签: javascript java json


【解决方案1】:

查看您想要返回的对象类型,我首先使用“数据”数组填充Map&lt;String,JSONArray&gt;。所以用这个迭代你当前得到的输出

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 的条目集看起来很像您发布的所需输出。剩下要做的就是将该条目集转换为JSONArray

为此,使用map.entrySet() 获取map 的条目集,它返回一个Set&lt;Entry&lt;String,JSONArray&gt;,您可以使用for-each 循环对其进行迭代。调用条目的getKey() 会返回String 元素映射,它会像您说的那样进入JSONObject 中的name。调用条目的getValue() 返回由循环构建的JSONArray,它进入data。将这些对象添加到 JSONArray,您就拥有了您想要的东西。

【讨论】:

  • 很抱歉,您能再解释一下吗?
  • @spaul 我添加了一些更详细的解释。
  • 感谢您的解释。这里使用的变量 currentResult 是什么?
  • currentResult是您目前得到的最终产品,我认为主要是jArr。不过,我很确定你不能真正使用 for-each。
  • 你是对的。我现在的最终产品是一个 json 数组,但 JSON 数组是不可迭代的。所以在使用 jArr 代替 currentResult 时出现错误。另外,我还没有初始化任何地图。
猜你喜欢
  • 1970-01-01
  • 2021-10-18
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
相关资源
最近更新 更多