2016-10-04 55 views
2

我在小型項目中遇到問題。我花了大約4天的時間,但還沒有最好的解決方案。JSONObject和JDBC返回格式json不正確

這是我的源代碼:

public static JSONObject fetchPersonCarInfo() throws Exception { 

    // get data from 2 tables: Cars and Manufacturer    
    String query = "SELECT * from mytable";  
     statement = connection.prepareStatement(query);   
     rs = statement.executeQuery(); 
     JSONArray carsArray = null;       
     while(rs.next()) { 

      carObj.put("id", (new string(rs.getString("id"))));      


      carsArray.put(carObj); 

      for(int i=0 ; i< carsArray.length() ; i++) { 

      manufacturerObj.put(new String(rs.getString("manufacturer_id")), carsArray); 
      manufacturerObj.put(new String(rs.getString("manufacturer_name")), carsArray); 
      } 
      System.out.println(manufacturerObj.toString()); 
    } 
      System.out.println("Ok"); 
    } 
    catch (Exception e) { 
     // TODO Auto-generated catch block 
     if (connection != null) { 
      connection.close(); 
     } 
      throw e; 
    } 
    finally { 
      if (connection != null) { 
       connection.close(); 
     } 
    } 

    return manufacturerObj; 
}   

然後,我建我的代碼,並通過URL部署,它似乎不正確的,有什麼不對如我所料,這是我的結果JSON格式:

{ 
    "1": 
    [ 
     { 
      "manufacturer_id": "1", 
      "manufacturer_name": "Honda" 
     }, 
     { 
      "id": "4", 
      "name": "Honda1", 
      "price": "66000" 
     } 
    ],   
} 

我該如何改變我的代碼來構建正確的上述json格式。非常感謝...

+0

你的第一個代碼示例是不是JSON –

+0

我會推薦像「{」製造商「:[{」id「:1,」name「:」Honda「,」cars「:[...]},{」id「:2,」name「:」Toyota「 ,「汽車」:[...]}]}' –

+0

親愛的cricket_007,是的,我的第一個代碼不是Json,它只有Json格式供我參考輸出。我認爲我的第二個代碼有一些錯誤 – luongkhanh

回答

0

carObj部分是好的,所以我會建議使它成爲一種方法。

public static JSONObject getCarJSON(String id, String name, String price) { 
    JSONObject carObj = new JSONObject();     
    carObj.put("id", id);      
    carObj.put("name", name); 
    carObj.put("price", price); 
    return carObj; 
} 

你的問題似乎在這裏。您正在向carsArray添加personCarObj。那大概只是包含汽車。

JSONObject personCarObj = new JSONObject();       
personCarObj.put("manufacturer_id", (new String(rs.getString("manufacturer_id")))); 
personCarObj.put("manufacturer_name", (new String(rs.getString("manufacturer_name")))); 
carsArray.put(personCarObj); 

而這裏。對於carsArray中的每個「汽車」,您都將一個鍵值對放入manufacturerObj,其中值始終相同carsArraymanufacturerObj應該可能只是包含製造商信息。

for(int i=0 ; i< carsArray.length() ; i++) { 

    manufacturerObj.put(new String(rs.getString("manufacturer_id")), carsArray); 
    manufacturerObj.put(new String(rs.getString("manufacturer_name")), carsArray); 
} 

因此,這些建議,您想嘗試讓喜歡你的最初顯示的非JSON。

{ 
    "manufacturers": [{ 
     "id": "1", 
     "name": "Honda", 
     "cars": [{ 
      "id": "4", 
      "name": "Honda1", 
      "price": "66000" 
     }] 
    }, { 
     "id": "2", 
     "name": "Toyota", 
     "cars": [{ 
      "id": "551", 
      "name": "Toyota51", 
      "price": "3233333" 
     }] 
    }] 
} 

和下面的代碼可能會接近(警告:未測試)。地圖的原因是當你已經看到製造商時捕獲,然後附加數據而不是重複。

JSONArray manufacturerArray = new JSONArray(); 
HashMap<String, JSONArray> manufacturerMap = new HashMap<String, JSONArray>(); 

while(rs.next()) { 
    String mId = rs.getString("manufacturer_id"); 
    JSONArray carsArray = manufacturerMap.get(mId); 
    if (carsArray == null) { 
     carsArray = new JSONArray(); 
     manufacturerMap.put(mId, carsArray); 
    } 
    JSONObject manufacturer = new JSONObject();       
    manufacturer.put("id", mId); 
    manufacturer.put("name", rs.getString("manufacturer_name"));     

    String carId = rs.getString("id");      
    String carName = rs.getString("name"); 
    String carPrice = rs.getString("price"); 
    carsArray.put(getCarJSON(carId, carName, carPrice)); 

    manufacturer.put("cars", carsArray); 
    manufacturerArray.put(manufacturer); 
} 
JSONObject result = new JSONObject(); 
result.put("manufacturers", manufacturerArray); 

可以使用傑克遜/ GSON做出一些POJO的這樣

class Manufacturer { 
    String id, name; 
    List<Car> cars; 
} 

class Car { 
    String id, name, price; 
} 

然後你會序列化List<Manufacturer>

+0

親愛的Cricket_007,我明白了,它的工作! – luongkhanh

+0

很高興聽到。不用謝。你可以通過[接受答案]來顯示你的感謝(http://stackoverflow.com/help/someone-answers) –

+0

也許這對我來說是最好的解決方案。感謝您的支持 – luongkhanh