如何将SQL数据映射到Java JSON对象和JSON数组?
我正在用Java构建JSON对象,并希望将它们发送到JSON数组中,这一切都是因为我的数据库中存在未排序的数据。我无法将数据映射到正确的格式。我认为我缺乏逻辑 下面是MySQL中我的数据库表的图像: 我想为这个表创建一个JSON格式,如下所示:如何将SQL数据映射到Java JSON对象和JSON数组?,java,mysql,json,Java,Mysql,Json,我正在用Java构建JSON对象,并希望将它们发送到JSON数组中,这一切都是因为我的数据库中存在未排序的数据。我无法将数据映射到正确的格式。我认为我缺乏逻辑 下面是MySQL中我的数据库表的图像: 我想为这个表创建一个JSON格式,如下所示: [ { "1": "450", "2": "495", "OUTLET": "TOTTAL2", "BILLDATE": "", "TOTAL": "945" }, { "1": "10"
[
{
"1": "450",
"2": "495",
"OUTLET": "TOTTAL2",
"BILLDATE": "",
"TOTAL": "945"
},
{
"1": "10",
"2": "15",
"OUTLET": "Ol1",
"BILLDATE": "08-21-2018",
"TOTAL": "25"
},
{
"1": "20",
"2": "25",
"OUTLET": "ol1",
"BILLDATE": "08-22-2018",
"TOTAL": "45"
},
{
"1": "30",
"2": "35",
"OUTLET": "ol1",
"BILLDATE": "08-23-2018",
"TOTAL": "65"
},
{
"1": "40",
"2": "45",
"OUTLET": "ol2",
"BILLDATE": "08-21-2018",
"TOTAL": "85"
},
{
"1": "50",
"2": "55",
"OUTLET": "ol2",
"BILLDATE": "08-22-18",
"TOTAL": "105"
},
{
"1": "60",
"2": "65",
"OUTLET": "ol2",
"BILLDATE": "08-23-2018",
"TOTAL": "125"
},
{
"1": "70",
"2": "75",
"OUTLET": "ol3",
"BILLDATE": "08-21-2018",
"TOTAL": "145"
},
{
"1": "80",
"2": "85",
"OUTLET": "ol3",
"BILLDATE": "08-22-2018",
"TOTAL": "165"
},
{
"1": "90",
"2": "95",
"OUTLET": "ol3",
"BILLDATE": "08-23-201818",
"TOTAL": "185"
}
]
上面的JSON是我想要的输出。但我无法映射循环中的数据,或者我无法获得逻辑。我只想为html表创建一个JSON格式,我还提供了我想要的JSON
我落后的地方在于编码和逻辑思维,即如何循环数据以获得所需的格式:
这就是我要做的桌子
我了解java中的GSON来解析json(在java中发送json),所以我可以做到这一点,我唯一想做的就是喜欢如何编写代码
这是我的Java代码,通过它我可以得到第一个头
String TotalAmountWithDateSql = "quwry1";
// System.out.println("TotalAmountWithDateSql"+TotalAmountWithDateSql);
String GrandTotalSql = "query2";
// System.out.println("grandTotal"+GrandTotalSql);
try {
con = DBConnection.createConnection();
statement = con.createStatement();
ResultSet resultSet = statement.executeQuery(GrandTotalSql);
while (resultSet.next()) {
map.put("OUTLET/HOURS", " ALL");
GrandTotal = resultSet.getLong("TOTAL");
map.put("TOTAL", GrandTotal);
resultSet = statement.executeQuery(TotalAmountWithDateSql);
while (resultSet.next())
{
BillTime = resultSet.getString("TIME");
NetAmtWithTime = resultSet.getLong("AMOUNT");
map.put(BillTime, NetAmtWithTime);
}
list.add(map);
str = gson.toJson(list);
}
System.out.println("value " + str);
response.setContentType("application/json");
response.getWriter().write(str);
从这段Java代码中,我得到了
现在我想调用下面的数据,就像我上传的JSON一样,但这只是给我第一个标题:
这确实很简单。您需要获取所有记录并创建一个包含map对象的列表,其中每个map对象将包含您想要的五个键值对 以下是您需要编写的代码类型
public static void main(String[] args) throws IOException {
createJson();
}
public static List<Map<String, String>> getMapList(ResultSet rs) throws SQLException {
List<Map<String, String>> mapList = new ArrayList<Map<String,String>>();
while(rs.next()) {
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("1", rs.getString("col1"));
map.put("2", rs.getString("col2"));
map.put("OUTLET", rs.getString("outlet"));
map.put("BILLDATE", rs.getString("billdate"));
map.put("TOTAL", rs.getString("total"));
mapList.add(map);
}
return mapList;
}
public static void createJson() {
List<Map<String, String>> mapList = new ArrayList<Map<String,String>>();
Map<String, String> map1 = new LinkedHashMap<String, String>();
map1.put("1", "50");
map1.put("2", "55");
map1.put("OUTLET", "ol2");
map1.put("BILLDATE", "08-22-18");
map1.put("TOTAL", "105");
Map<String, String> map2 = new LinkedHashMap<String, String>();
map2.put("1", "60");
map2.put("2", "65");
map2.put("OUTLET", "ol3");
map2.put("BILLDATE", "08-23-18");
map2.put("TOTAL", "125");
mapList.add(map1);
mapList.add(map2);
String json = new Gson().toJson(mapList);
System.out.println(json);
}
publicstaticvoidmain(字符串[]args)引发IOException{
createJson();
}
公共静态列表getMapList(ResultSet rs)引发SQLException{
List mapList=new ArrayList();
while(rs.next()){
Map Map=newlinkedhashmap();
map.put(“1”,rs.getString(“col1”);
map.put(“2”,rs.getString(“col2”);
map.put(“OUTLET”,rs.getString(“OUTLET”);
map.put(“BILLDATE”,rs.getString(“BILLDATE”);
map.put(“总计”,rs.getString(“总计”);
地图列表。添加(地图);
}
返回地图列表;
}
公共静态void createJson(){
List mapList=new ArrayList();
Map map1=新建LinkedHashMap();
map1.投入(“1”、“50”);
map1.put(“2”、“55”);
map1.put(“出口”、“ol2”);
图1.put(“账单日期”,“08-22-18”);
map1.put(“总计”、“105”);
Map map2=新建LinkedHashMap();
map2.put(“1”、“60”);
map2.put(“2”、“65”);
map2.put(“出口”、“ol3”);
map2.put(“账单日期”,“08-23-18”);
map2.put(“总计”、“125”);
mapList.add(map1);
mapList.add(map2);
字符串json=new Gson().toJson(映射列表);
System.out.println(json);
}
希望这有帮助。让我们后退一步,尝试用SQL完成所有工作。MySQL可以使用(类似于标准SQL)计算总计,您不需要两次往返。此外,MySQL支持(某种程度上)标准,所以您不必在Java中进行任何格式化 首先,让我们尝试在不生成JSON的情况下编写SQL查询:
选择
案例
--总数的标签
分组(出口)=1时,则为“总计2”
--防止在每个插座组的第2行+上打印插座
当row_number()超过(按门店顺序按billdate划分)=1时,则为门店
作为出口结束,
比尔达特,
总和(netAmount)为“总计1/Ho…”,
--根据你的数据,这只是一个愚蠢的假设。
--你的实际公式可能更复杂
总和(mod(hours,2)=1,然后是netAmount END)为'1`,
总和(当mod(小时数,2)=0时,则netAmount结束)为'2`
--可能更多?
从t
按门店分组,带汇总的billdate
--仅获取总计或普通分组
分组(出口)=1或分组(billdate)=0
--如果需要,可以在此处添加ORDER BY以获得所需的订单
接下来,让我们生成JSON
为简单起见,我不会重写上面的整个查询,而是将其放在CTE中,这是一个构造SQL的便捷工具:
与
塔斯(
--复制粘贴上一个查询到这里
)
挑选
json_ArrayAg(json_对象(
'1',t.'1`,
‘2’,t.‘2’,
“出口”,t.出口,
“BILLDATE”,t.BILLDATE,
“总计”,t.TOTAL
))
从t
注意,您也可以使用第三方库,如jOOQ,或(免责声明,我为jOOQ背后的公司工作)。,例如编写
SELECT
语句,使用JDBC、JPA或其他方法检索数据,将数据处理成所需的形式,从内存中的数据结构生成JSON。简言之,就目前的问题而言,它太宽泛了。@Andreas我正在使用一个查询的哈希映射,我正在调用outlets并将它们存储到list中,然后根据第一个查询的大小运行下一个查询以获取日期,但我无法将它们循环到{}。不要试图在注释中用文本进行解释。编辑问题,在那里解释,显示你的代码,并解释你的具体位置。然后,你甚至可以像我硬编码一样,用hashmap键编写它们。不用硬编码“1”和“2”,您可以编写rs.getString(“yourcolumnname”),当然,如果您遇到任何问题,请告诉我。您可以按原样运行我的代码,它将完全按照您的需要输出json字符串。您的架构不清晰,因为您附加的图像没有显示所有列。如果您可以共享模式,甚至查询,我将能够更好地帮助您。