![](/img/trans.png)
[英]IllegalStateException: This is not a JSON Array (Gson Java)
[英]Gson/Json to array java
我有一台連接到 SQLite 數據庫的服務器。 從這里我將數據放入 HashMap,然后放入 Json 以通過客戶端處理程序發送。
然后我嘗試使用 swing 客戶端 GUI 將服務器中的數據放入表中。 在客戶端,為了確保我正在接收數據,我將回復打印到控制台。
while (true){
count++;
if (socket == null){
guiClientSays("Waiting for connection to be reset...");
synchronized (waitObject){
try{
waitObject.wait();
}catch (InterruptedException ex){
Logger.getLogger(GUIClient.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
guiClientSays("Waiting for message" + count + " from server...");
String reply = null;
try{
reply = bufferedReader.readLine();
guiClientSays("Received \"" + reply + "\" from server.");
}catch (IOException ex){
guiClientSays("IOException " + ex);
}
}
在控制台中我得到這個
Client1: Received "{"1":{"driverId":1,"driverRef":"hamilton","number":"44","code":"HAM","forename":"Lewis","surname":"Hamilton","dob":"07/01/1985","nationality":"British","url":"http://en.wikipedia.org/wiki/Lewis_Hamilton"},"2":{"driverId":2,"driverRef":"heidfeld","number":"","code":"HEI","forename":"Nick","surname":"Heidfeld","dob":"10/05/1977","nationality":"German","url":"http://en.wikipedia.org/wiki/Nick_Heidfeld"},"3":{"driverId":3,"driverRef":"rosberg","number":"6","code":"ROS","forename":"Nico","surname":"Rosberg","dob":"27/06/1985","nationality":"German","url":"http://en.wikipedia.org/wiki/Nico_Rosberg"}, etc
為了確保我可以填充表,我將 GUI 客戶端連接到可以正常工作的數據庫
ArrayList<Driver> drivers = Driver.readAllDrivers();
DefaultTableModel model = (DefaultTableModel) driverTable.getModel();
model.setRowCount(0);
for (Driver driver : drivers){
model.addRow(new Object[]{
driver.getDriverId(),
driver.getDriverRef(),
driver.getNumber(),
driver.getCode(),
driver.getForename(),
driver.getSurname(),
driver.getDob(),
driver.getNationality(),
driver.getUrl()
});
}
driverTable.setModel(new DefaultTableModel(
null,
new String[]{"Driver ID", "Driver Ref", "Number", "Code", "Forename", "Surname", "DOB", "Nationality"
, "URL"}
));
一旦我得到了服務器要發送的數據,我就嘗試了這個:
String driverReply;
driverReply = reply;
String rows[] = ((String) driverReply).split("\n");
Vector<Vector<String>> dataVector = new Vector<Vector<String>>();
for (String row : rows) {
row = row.trim();
Vector<String> data = new Vector<String>();
data.addAll(Arrays.asList(row.split(",")));
dataVector.add(data);
}
Vector<String> header = new Vector<String>(9);
header.add("Driver ID");
header.add("Driver Ref");
header.add("Number");
header.add("Code");
header.add("Forename");
header.add("Surname");
header.add("DOB");
header.add("Nationality");
header.add("URL");
該圖顯示了圖形用戶界面及其輸出表格的方式
我應該得到 800 行,它應該像這樣顯示:
1 hamilton 44 HAM Lewis Hamilton 07/01/1985 英國http://en.wikipedia.org/wiki/Lewis_Hamilton 2 heidfeld HEI Nick Heidfeld 10/05/1977 德國http://en.wikipedia.org/wiki/Nick_Heidfeld
ETC
您可以使用 JsonObject 而不是 String 類型作為 var“reply”。
https://docs.oracle.com/javaee/7/api/javax/json/JsonObject.html
在客戶端,你可以這樣寫:
JSONParser parser = new JSONParser();
JSONObject reply = (JSONObject) parser.parse(bufferedReader.readLine());
之后,您可以使用所有回復值設置 DataVector,如下所示:
Vector<Vector<String>> dataVector = new Vector<Vector<String>>();
reply.keySet().forEach(rowKeyStr ->
{
JSONObject row = (JSONObject)jsonObj.get(rowKeyStr);
Vector<String> data = new Vector<String>();
row.keySet().forEach(fieldKeyStr ->
{
String field = (String)jsonObj.get(fieldKeyStr);
data.add(field);
}
dataVector.add(data);
});
我希望這對你有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.