2016-10-04 3 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 " , "cars": [...]}]} ' –

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

Ваша проблема, кажется, здесь. Вы добавляете personCarObj в carsArray. Это должно быть, вероятно, только содержат автомобили.

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, где значение всегда одно и то же carsArray. manufacturerObj должен, вероятно, только содержит информацию о производителе.

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

Смежные вопросы