如何从MySQL获取所需格式的JSON

时间:2017-05-09 10:12:20

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

使用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。如果我没有走向正确的方法,请引导我走向正确的方法。 感谢。

2 个答案:

答案 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();

我没有对此进行过测试,但从理论上说它应该可行!