Извините, возможный вопрос новичка, я пытаюсь изучить 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. Я хочу переместить его в подполе (называемое, например, «данные»), а затем иметь еще пару пар ключ/значение на корневом уровне. Как мне изменить код, чтобы сделать это, пожалуйста? (Я мог бы передать пару дополнительных значений в качестве параметров)
Спасибо.




Вы можете сделать что-то вроде
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;
}
Да, вы можете использовать toString для преобразования объекта в строку json.
Поскольку это вопрос 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 и еще пару пар ключ/значение в корне? Спасибо
it - это счетчик от 1 до количества столбцов, и вы могли бы сделать new JsonBuilder([a: 1, b: 'tim', items: result]).toString()
Большое спасибо @Ilya, хорошо выглядит. Я не понимал, что JSONObject может возвращать JSONArray. Предположим, я могу использовать root.toString(), чтобы получить полную строку JSON для отправки во внешний интерфейс? Спасибо