Как сделать мой Java JSONArray вложенным и добавить поля?

Извините, возможный вопрос новичка, я пытаюсь изучить Java, участвуя в проекте на работе. На самом деле код Groovy (и мы используем Grails), но предположим, что для этой цели он одинаков.

Я пытаюсь преобразовать JDBC ResultSet в JSON (для отправки во внешний интерфейс). Получил следующий код из блога:

// Convert JDBC ResultSet to JSON string
public static JSONArray convertToJSON(ResultSet resultSet)
        throws Exception {
    JSONArray jsonArray = new JSONArray();
    ResultSetMetaData metaData = resultSet.getMetaData(); // Result set meta data
    int total_columns = metaData.getColumnCount(); // Number of columns in the row

    while (resultSet.next()) { // Take each row from the result set
        JSONObject obj = new JSONObject();
        for (int i = 0; i < total_columns; i++) {
            obj.put(metaData.getColumnLabel(i + 1)
                    .toLowerCase(), resultSet.getObject(i + 1));
        }
        jsonArray.put(obj);
    }
    return jsonArray.toString(); // Return as JSON string
}

Это (я полагаю) даст мне структуру JSON с данными в корне/верхней части JSON. Я хочу переместить его в подполе (называемое, например, «данные»), а затем иметь еще пару пар ключ/значение на корневом уровне. Как мне изменить код, чтобы сделать это, пожалуйста? (Я мог бы передать пару дополнительных значений в качестве параметров)

Спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
442
3

Ответы 3

Вы можете сделать что-то вроде

JSONObject rootObject = new JsonObject();
rootObject.put("data", jsonArray);

Это позволит вам рассматривать ваш JSON как пару ключ-значение и должно выполнять то, что вы просите.

Кроме того, вы можете захотеть использовать ObjectMapper для преобразования вашего объекта в JSON. Это позволит вам создать JSONObject из объекта Java с чем-то вроде objectMapper.writeValueAsString(resultSet).

Я думаю, что в предоставленном вами фрагменте кода есть ошибка, поскольку ваша подпись указывает JSONArray как тип возвращаемого значения, но вы возвращаете String, в любом случае, вот что я бы предложил:

public static JSONObject convertToJSON(ResultSet resultSet)
        throws Exception {
    JSONObject root = new JSONObject();
    JSONArray jsonArray = new JSONArray();
    root.put("data", jsonArray);
    ResultSetMetaData metaData = resultSet.getMetaData(); // Result set meta data
    int total_columns = metaData.getColumnCount(); // Number of columns in the row

    while (resultSet.next()) { // Take each row from the result set
        JSONObject obj = new JSONObject();
        for (int i = 0; i < total_columns; i++) {
            obj.put(metaData.getColumnLabel(i + 1)
                    .toLowerCase(), resultSet.getObject(i + 1));
        }
        jsonArray.put(obj);
    }
    return root;
}

Большое спасибо @Ilya, хорошо выглядит. Я не понимал, что JSONObject может возвращать JSONArray. Предположим, я могу использовать root.toString(), чтобы получить полную строку JSON для отправки во внешний интерфейс? Спасибо

Alex Kerr 06.02.2019 15:38

Да, вы можете использовать toString для преобразования объекта в строку json.

Ilya 06.02.2019 15:50

Поскольку это вопрос Groovy, вы можете сделать свой код более Groovy ;-)

static String convertToJSON(ResultSet resultSet) throws Exception {
    def metaData = resultSet.metaData // Result set meta data
    def result = []
    while (resultSet.next()) { // Take each row from the result set
        result << (1..metaData.columnCount).collectEntries {
            [metaData.getColumnLabel(it).toLowerCase(), resultSet.getObject(it)]
        }
    }
    return new JsonBuilder(result).toString() // Return as JSON string
}

Спасибо. Что это за отсылка? И как мне получить данные набора результатов в подразделе JSON и еще пару пар ключ/значение в корне? Спасибо

Alex Kerr 06.02.2019 16:51
it - это счетчик от 1 до количества столбцов, и вы могли бы сделать new JsonBuilder([a: 1, b: 'tim', items: result]).toString()
tim_yates 06.02.2019 22:09

Другие вопросы по теме