Java org.json JDBC 仅来自数据库的最后一行表



我有一个RESTful应用程序,它连接到MySQL数据库(原始粘贴在这里:https://pastebin.com/raw/3fBp3j0B)并以JSON格式打印出表数据。

如果我从ResultSet System.out.println()一些数据,一切都会正确显示,但使用 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
    }
]

如果您为 while 循环中的每个迭代创建一个新JSONObject,它应该可以工作:

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);
}

Java 是按引用传递的,因此当您将属性放入jsonolio时,即使在 JSONArray 中,它也会覆盖以前的值,因为它仍然是同一个对象

将对象放在另一个容器中不会为您创建副本。 你有 1 个 JSON 对象,你填写了两次。 并在列表中放置了 2 个副本。 最后,1 对象中只有第二组值。 所以这就是得到输出的东西。把这条线放在JSONObject jsonolio = new JSONObject();while (tulosjoukko.next()) {之后

最新更新