2016-11-17 91 views
0

正如標題,我有我的JSON格式字符串爲數組的數組(列表)的問題JSON陣列格式問題

基本上這就是我想的格式見:

{"Item": 
    ["Id: 1","Title: Surface Pro 4","Phone: 4077603835","Email: 
    [email protected]","Description: Surface Pro 4 for sale, in 
    excellent condition, basically brand new!"], 

"Item": 
    "Id: 2","Title: Macbook Air","Phone: null","Email: 
    null","Description: null"], 
"Item": 
    "Id: 3","Title: Lenovo Laptop","Phone: 3433215565","Email: 
    XXXXXXXX.com","Description: Free Macbook Air, I promise"] 
} 

然而,這是下面的格式,我的代碼是生產:

{"Item":["Id: 1","Title: Surface Pro 4","Phone: 4077603835","Email: 
[email protected]","Description: Surface Pro 4 for sale, in 
excellent condition, basically brand new!","Id: 2","Title: Macbook 
Air","Phone: null","Email: null","Description: null","Id: 3","Title: 
Lenovo Laptop","Phone: 3433215565","Email: 
XXXXXXXX.com","Description: Free Macbook Air, I promise"]} 

我只是想看看不同的數組中的每個項目!我認爲問題在於這部分代碼:「obj.put(」Item「,items);」因爲它將所有項目放在同一個數組中,但我如何動態創建不同的數組?我的物品清單將不斷擴大,永遠不會保持不變。

代碼:

public List<String[]> SelectAllSQL() { 
    List<String[]> result = new ArrayList<String[]>(); 

    sql = "select * from item"; 

    try { 
     ResultSet rs = stmt.executeQuery(sql); 

     rs.last(); 
     int lastRow = rs.getRow(); 

     for(int row = 1; row <= lastRow; row++) { 
      rs.absolute(row); 

      result.add(new String[] {rs.getString("title"), 
         rs.getString("phone"), rs.getString("email"), 
         rs.getString("description"), 
         rs.getString("id")}); 
     } 
     return result; 
    } 
    catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

public String getIt() { 
    ConnectionDB db = new ConnectionDB(); 
    QueryDB query = new QueryDB(); 

    List<String[]> sqlResult = new ArrayList<String[]>(); 

    db.Connect(); 

    sqlResult = query.SelectAllSQL(); 

    JSONObject obj = new JSONObject(); 
    JSONArray items = new JSONArray(); 

    for(String[] arr : sqlResult) { 
     items.add("Id: " + arr[4]); 
     items.add("Title: " + arr[0]); 
     items.add("Phone: " + arr[1]); 
     items.add("Email: " + arr[2]); 
     items.add("Description: " + arr[3]); 

     obj.put("Item", items); 
    } 
    return obj.toJSONString(); 
+1

將'JSONArray items = new JSONArray();'放入'for'循環的範圍中。在你的情況下,你對所有不同的項目使用相同的「項目」。 – David

回答

1

兩件事情:

  1. 重新初始化JSONArray的循環內的每個項目,讓您的SQLRESULT的每一行都會有自己的屬性陣列。現有的代碼將其初始化一次,這就是當前輸出中的數組如何以其中的三個數據結束。

    for(String[] arr : sqlResult) { 
        JSONArray items = new JSONArray(); 
    
  2. JSONObject不允許多個條目具有相同的鍵。 JSONObject不允許你有三個條目,所有條目的值都是「Item」。當obj.put("Item", items);被第二次和第三次調用時,它會替換「Item」的前一個值,而不是創建新條目。許多可能的解決方案中的兩個,都需要改變你的期望輸出

    • 選擇一個密鑰,該密鑰獨特的每個記錄,如可能的ID
    • 創建另一個JSONArray含3+項目而不是它是關聯的JSONObject的
+0

非常感謝,這解決了我的問題! –

2

我覺得你與該行的代碼創建問題的權利。您可以考慮包含Key和Value對的JSON對象。在你的情況下,它的「Item」是Key,而數組就是Value。您通過它們的Keys訪問JSON對象值,因此不能使用相同的Key具有Key和Value對。

解決方案:讓您的密鑰不同。 「Item1」,「Item2」,「Item3」。另外放置JSONArray items = new JSONArray();在你的範圍像大衛說

1
JSONArray items = new JSONArray(); 

保持它內部的for循環,因爲它會重建JSONArray,否則所發生的事情它也加入到同一個陣列elmenets,所以把它裏面循環