如何从 MySQL 中获取所需格式的 JSON
How to fetch JSON of desired format from MySQL
使用 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。如果我不采取正确的方法,请引导我采取正确的方法。
谢谢。
与其返回 Object[] 列表,不如创建一个类型化的对象
public class ResultHours {
public int value;
public Date date;
}
然后更新 getResultList()
;
List<ResultHours[]> resultHours = (List<ResultHours[]>) query.getResultList();
我没有测试过这个,但理论上它应该可以工作!
问题是 gson 不知道调用的属性是什么,所以它生成了一个未命名值的数组。
虽然添加新的 class 会简化事情,但是对于每个 return 类型的查询添加新的 class 意味着很多相当无用的 classes,尤其是如果它们仅用于编组。
相反,您可以像这样将名称映射到每个属性列表
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]
}
使用 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。如果我不采取正确的方法,请引导我采取正确的方法。 谢谢。
与其返回 Object[] 列表,不如创建一个类型化的对象
public class ResultHours {
public int value;
public Date date;
}
然后更新 getResultList()
;
List<ResultHours[]> resultHours = (List<ResultHours[]>) query.getResultList();
我没有测试过这个,但理论上它应该可以工作!
问题是 gson 不知道调用的属性是什么,所以它生成了一个未命名值的数组。
虽然添加新的 class 会简化事情,但是对于每个 return 类型的查询添加新的 class 意味着很多相当无用的 classes,尤其是如果它们仅用于编组。
相反,您可以像这样将名称映射到每个属性列表
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]
}