【问题标题】:How to fetch JSON of desired format from MySQL如何从 MySQL 获取所需格式的 JSON
【发布时间】:2017-10-07 14:23:45
【问题描述】:

使用 play framework 2.0 和我的 java 代码:

String queryString="SELECT watchDuration, date(startTime) from SEData";
Query query=JPA.em().createNativeQuery(queryString);
List<Object[]> resultHours = (List<Object[]>) query.getResultList();
Gson gson = new Gson();
String json = gson.toJson(resultHours);
renderJSON(json);

浏览了一段时间后,我确实尝试使用 Gson,结果我得到以下输出:

[[5.0,"Feb 5, 2014"],[6.0,"Feb 6, 2014"],[1.0,"Feb 7, 2014"],[2.0,"May 3, 2017"],[3.0,"May 4, 2017"]]

由于我要获取此数据以绘制在 c3.js 图表上,因此我需要以下格式:

json:[{"value":5, "date":"Feb 5, 2014"},{"value":6, "date":"Feb 6, 2014"},{"value":1, "date":"Feb 7, 2014"},{"value":2, "date":"May 3, 2017"},{"value":3, "date":"May 4, 2017"}]

json: {
     value:[5, 6, 1, 2, 3],
     date: ["Feb 5, 2014", "Feb 6, 2014", "Feb 7, 2014", "May 3, 2017", "May 4, 2017"]
          }

如何实现以上格式检索MySQL数据库? 我怀疑我对 Gson 的方法是否错误,因为我得到的输出甚至不是我相信的 JSON。如果我没有朝着正确的方向前进,请引导我走向正确的方法。 谢谢。

【问题讨论】:

    标签: java mysql json playframework-2.0 c3.js


    【解决方案1】:

    与其返回 Object[] 的列表,不如创建一个类型化的对象

    public class ResultHours {
      public int value;
      public Date date; 
    }
    

    然后更新getResultList();

    List<ResultHours[]> resultHours = (List<ResultHours[]>) query.getResultList();
    

    我没有对此进行测试,但理论上它应该可以工作!

    【讨论】:

    • 好的,我试试看!
    【解决方案2】:

    问题是 gson 不知道属性被称为什么,所以它创建了一个未命名值的数组。

    虽然添加一个新类会简化事情,但为查询的每个返回类型添加一个新类意味着很多相当无用的类,尤其是当它们仅用于编组时。

    相反,您可以像这样将名称映射到每个属性列表

    HashMap<String, ArrayList<Object> > map = new HashMap<String, ArrayList<Object> >();
    
    ArrayList<Object> values = new ArrayList<Object>();
    ArrayList<Object> dates = new ArrayList<Object>();
    
    for(int i=0; i < list.size(); i++){
        values.add(resultHours.get(i)[0]);
        dates.add(resultHours.get(i)[1]);
    }
    
    map.put("value", values);
    map.put("date", dates);
    

    这会产生所需的输出:

    {
        "date": ["Jan","Feb","Mar","April"],
        "value": [1,2,3,4]
    }
    

    【讨论】:

    • 这就像我需要的一样工作。我完全忘记了哈希图,感谢您打开我的第三只眼 :D。我要求您为未来的用户更正以下行中的拼写错误。再次感谢。 HashMap&lt;String, ArrayList&lt;Object&gt; &gt; map = new HashMap&lt;String, ArrayList&lt;Object&gt; &gt;();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2011-04-27
    • 1970-01-01
    • 2012-07-20
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多