Возьмите результаты из JDBC и превратите их в JsonObject

Я пытаюсь получить результаты из своего JDBC и превратить их в объекты Json, и мне это трудно сделать. Это то, что у меня есть

Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;

try {
    con=DB.getConnection();
    String query = "Select city,state from zips where zip=10012";
    ps=con.prepareStatement(query);
    String line="";
    while(rs.next())
    {
        line=  rs.getArray("city").toString();
    }
    JSONObject jsonObj = new JSONObject(line);

Как видите, я пытаюсь получить результаты цикла while и поместить их в переменную String, а затем поместить в JsonObject.

Это явно не работает, у кого-нибудь есть предложения? Я искал и настраивал этот код, и ничего не работает.

Если это имеет какое-то значение, я использую Java 1.8 JDK.
Соединение с базой данных работает, и я попробовал этот запрос из MySQL, поэтому, очевидно, что-то в коде.

Обновление: я получаю пустую страницу, когда проверяю вывод запроса. Причина, по которой я хочу это в Json, заключается в том, что это должен быть спокойный сервис для Android. rs.next() используется в цикле для получения всех результатов запроса.


person Ignacio Perez    schedule 18.06.2015    source источник
comment
Попробуйте объяснить, что вы пытаетесь сделать в цикле while(rs.next()). Кстати, вы должны использовать StringBuilder для этого.   -  person Pshemo    schedule 19.06.2015
comment
Также это явно не работает, неясная постановка проблемы. Попробуйте отредактировать свой вопрос и описать, что вы ожидаете и что вы получаете вместо этого.   -  person Pshemo    schedule 19.06.2015
comment
Просто уточнил это сейчас, и хорошо, я буду использовать stringbuilder и посмотрю, что я получу.   -  person Ignacio Perez    schedule 19.06.2015
comment
На самом деле я могу ошибаться насчет StringBuilder. Общая идея заключается в том, что если вы хотите добавить много мелких деталей, которые вы получаете в каждой итерации, вам следует использовать не resutl += newContent, а instanceOfStringBuilder.append(newContent). Но если вы ожидаете, что ваш while(re.next()) будет выполняться только один раз, ваш подход должен быть хорошим (но вам, вероятно, следует изменить whilte на if, чтобы сделать ваш код более понятным).   -  person Pshemo    schedule 19.06.2015
comment
Ваш пример, кажется, указывает на предположение, что array.toString создает действительный JSON в строке, но это не так. Посмотрите на что-то вроде JSONArray city = new JSONArray(rs.getArray("city")); Хотя я все еще не уверен, что это то, что вам нужно.   -  person Taylor    schedule 19.06.2015
comment
Я рекомендую взглянуть на Джексона или GSON. Вы быстро поймете, что подход, который вы пытаетесь применить (даже если вы заставите его работать), будет неуправляемым.   -  person shinjw    schedule 19.06.2015
comment
Спасибо за это, я сейчас посмотрю на GSON.   -  person Ignacio Perez    schedule 19.06.2015


Ответы (1)


Вот подпрограмма, которую я написал, которая должна решить вашу проблему. По крайней мере, у меня это работает, используя PostgreSQL. Обратите внимание, что он создает JSONArray из JSONObjects. Итак, если вы преобразуете его в строку, вы получите что-то вроде: [{"city":"Berlin","state":"Berlin"},{"city":"Tucson","state":"Arizona "}, ...].

 public JSONArray table2json(ResultSet rs) throws Exception {
  JSONArray jsArray = new JSONArray();        
        int columns = rs.getMetaData().getColumnCount();
        while (rs.next()) {
            JSONObject obj = new JSONObject();
            for (int i = 1; i <= columns; i++) {
                Object tempObject=rs.getObject(i);
                obj.put(rs.getMetaData().getColumnLabel(i), tempObject);
            }
            jsArray.put(obj);
        }
        return jsArray;
person rissom    schedule 15.02.2016