Как получить JSONObject
из HttpServletRequest
в сервлетах?
Очень просто:
JSONObject o = new JSONObject(request.getParameter("WHATEVER"));
Изменить: поскольку вы используете json-lib, он
JSONObject o = (JSONObject) JSONSerializer.toJSON(request.getParameter("WHATEVER"));
для вас.
См. JSONObject ( java.lang.String
) . Это создаст объект JSONObject
, если вы передаете строку, которая является допустимым JSON. Конструктор выдает исключение JSONException
, поэтому вам придется с этим справиться. Это также хорошо, если вы отправляете недопустимый JSON.
Это действительно зависит от того, что вы делаете. По большей части JSONObject будет использовать методы получения bean-компонентов для создания вашего объекта JSON (если вы передадите bean-компонент конструктору). В противном случае вы можете передать объект вместе с массивом имен String. Здесь JSONObject
будет использовать отражение для определения общедоступных членов объекта. Затем он будет использовать предоставленные вами имена в качестве ключей к этому объекту.
JSONObject
без проблем справится с любыми типами Map
. Но если ваш объект представляет собой Список
, вам необходимо использовать JSONArray
. Другая проблема заключается в том, что ваша карта
содержит список List
. Затем по какой-то причине JSONObject
не может определить, что это List
, и будет использовать стандартное строковое представление списка List
(не то, что вы хотите ). Единственный способ справиться с этим - перебрать карту
и вручную построить JSONObject
.
Что касается вашего вопроса, я предполагаю, что у вас есть сервлет, действие которого возвращает JSON. В этом случае создайте новый JSONObject
и используйте PrintWriter
to и jsonObject.toString ()
для вывода вашего JSON.
GSON - довольно хорошая библиотека JSON на основе Java.
Вы делаете это немного трудным способом. Конечно, есть более простой способ сделать это. Просто отправляйте обычные параметры запроса, а не JSON. Вы можете использовать jQuery.serialize()
для сбора всех полей формы в качестве параметров. Вот пример того, как должен выглядеть JSP:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Test</title>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
$(document).ready(function() {
$('#form').submit(function() {
$form = $(this);
$.post($form.attr('action'), $form.serialize(), function(response) {
alert(response); // "OK"
});
return false;
});
});
</script>
</head>
<body>
<form id="form" action="register" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit">
</form>
</body>
</html>
А вот как может выглядеть сервлет, который слушает url-pattern
вида /register/*
:
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username + "," + password);
response.getWriter().write("OK"); // You can write JSON string here.
}
С jQuery form плагином это будет более прозрачно.
$(document).ready(function() {
$('#form').ajaxForm(function(response) {
alert(response); // "OK"
});
});
Чтобы ответить обратно от сервлета к jQuery, проще, если вы возвращаете реальные JSON данные. Например:
Map<String, Object> data = new HashMap<String, Object>();
if (userDAO.exist(username)) {
data.put("success", false);
data.put("message", "Username in use, please choose another");
} else {
userDAO.create(username, password);
data.put("success", true);
data.put("message", "User successfully registered");
}
response.setContentType("application/json");
response.getWriter().write(new Gson().toJson(data)); // Gson = Google Gson.
и затем в jQuery:
$(document).ready(function() {
$('#form').ajaxForm(function(data) {
$('#message').addClass(data.success ? 'success' : 'error').text(data.message).show();
});
});