我有一个RESTful应用程序,该应用程序连接到MySQL数据库(此处原始粘贴为https://pastebin.com/raw/3fBp3j0B),并以JSON格式打印出表数据。
如果我System.out.println()
的某些数据ResultSet
正确显示,但是使用JSON API,仅将表的最后一行打印两次。
import java.sql.*;
import javax.json.*;
public class Tietokanta {
protected Connection yhteys = null;
protected Statement kysely = null;
protected ResultSet tulosjoukko = null;
public boolean avaaYhteys() {
boolean ok = true;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
yhteys = DriverManager.getConnection("jdbc:mysql://localhost/savukelaskuri?serverTimezone=UTC", "root", "");
} catch (Exception e) {
e.printStackTrace();
ok = false;
}
return ok;
}
public boolean suljeYhteys() {
boolean ok = true;
try {
this.yhteys.close();
} catch (Exception e) {
ok = false;
}
return ok;
}
}
...
import java.math.BigDecimal;
import javax.json.Json;
import javax.json.JsonArray;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.Produces;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PUT;
import static javax.ws.rs.client.Entity.json;
import javax.ws.rs.core.MediaType;
import org.json.JSONArray;
import org.json.JSONObject;
@Path("savukkeet")
public class ApiResource extends Tietokanta {
JSONObject jsonolio = new JSONObject();
JSONArray jsontaulu = new JSONArray();
@Context
private UriInfo context;
public ApiResource() {
this.avaaYhteys();
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public String getJson() {
try {
kysely = yhteys.createStatement();
String sql = "SELECT * FROM kulutus";
tulosjoukko = kysely.executeQuery(sql);
while (tulosjoukko.next()) {
System.out.println(tulosjoukko.getString("pvm"));
jsonolio.put("id", tulosjoukko.getInt("id"));
jsonolio.put("pvm", tulosjoukko.getString("pvm"));
jsonolio.put("kulutus", tulosjoukko.getInt("kulutus"));
jsontaulu.put(jsonolio);
}
} catch (Exception e) {
e.printStackTrace();
}
return jsontaulu.toString(4);
}
}
我希望结果是
[
{
"kulutus": 9,
"pvm": "2019-01-14 16:46:00",
"id": 1
},
{
"kulutus": 8,
"pvm": "2019-01-15 21:18:00",
"id": 2
}
]
但是我得到了这个
[
{
"kulutus": 8,
"pvm": "2019-01-15 21:18:00",
"id": 2
},
{
"kulutus": 8,
"pvm": "2019-01-15 21:18:00",
"id": 2
}
]
答案 0 :(得分:2)
如果您为while循环中的每个迭代创建一个新的@ServletComponentScan
,它应该会起作用:
JSONObject
Java是传递引用,因此当您将属性设置为while (tulosjoukko.next()) {
System.out.println(tulosjoukko.getString("pvm"));
jsonolio = new JSONObject();
jsonolio.put("id", tulosjoukko.getInt("id"));
jsonolio.put("pvm", tulosjoukko.getString("pvm"));
jsonolio.put("kulutus", tulosjoukko.getInt("kulutus"));
jsontaulu.put(jsonolio);
}
时,它甚至会覆盖JSONArray中的先前值,因为它仍然是同一对象
答案 1 :(得分:1)
将对象放入另一个容器中不会为您创建副本。您有1个json对象,然后将其填充两次。然后将它的2个副本放入列表中。最后,1个对象中只有第二组值。所以这就是输出。
将此行Your build size is: 23552kb
Sending build request to the server, notice that the build might take a while to complete!
Sending build to account: xxxxxx@gmail.com
C:\workspace\nutriplanning\build.xml:101: java.lang.OutOfMemoryError: Java heap space
放在JSONObject jsonolio = new JSONObject();
之后