使用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。如果我没有走向正确的方法,请引导我走向正确的方法。 感谢。
答案 0 :(得分:1)
问题是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]
}
答案 1 :(得分:0)
不是返回Object []列表而是创建一个键入的对象
public class ResultHours {
public int value;
public Date date;
}
然后更新getResultList()
;
List<ResultHours[]> resultHours = (List<ResultHours[]>) query.getResultList();
我没有对此进行过测试,但从理论上说它应该可行!