Как я могу получить JSONObject
из HttpServletRequest
в сервлетах?
Получение JSONObject из String
Ответ 1
Очень просто:
JSONObject o = new JSONObject(request.getParameter("WHATEVER"));
Изменить: поскольку вы используете json-lib, это
JSONObject o = (JSONObject) JSONSerializer.toJSON(request.getParameter("WHATEVER"));
для вас.
Ответ 2
Кажется, вы должны использовать версию net.sf.json.JSONObject
JSONObject (это не версия json.org).
Для версии net.sf.json.JSONObject
просто используйте
JSONObject.fromObject(Object obj)
где obj
либо
- действительная строка в формате JSON
- a Bean POJO с геттерами и сеттерами.
Ответ 3
См. JSONObject(java.lang.String
). Это создаст объект JSONObject
, если вы передаете строку, действительную JSON. Конструктор выбрасывает JSONException
, поэтому вам придется это обработать. Это также хорошо, если вы отправляете недействительный JSON.
Это действительно зависит от того, что вы делаете. По большей части JSONObject будет использовать bean getters для создания вашего объекта JSON (если вы передадите конструктору bean). В противном случае вы можете передать объект вместе с массивом строк String. Здесь JSONObject
будет использовать отражение, чтобы выяснить публичные члены объекта. Затем он будет использовать имена, которые вы предоставляете в качестве ключей к этому объекту.
JSONObject
без проблем справится с чем-либо типа Map
. Но если ваш объект равен List
, вам нужно использовать JSONArray
. Другая проблема заключается в том, что ваш Map
содержит List
. Затем по какой-то причине JSONObject
не может понять, что это List
и будет использовать стандартное строковое представление List
(а не то, что вы хотите). Единственный способ справиться с этим - перебрать по Map
и построить JSONObject
вручную.
Что касается вашего вопроса, я предполагаю, что у вас есть сервлет, у которого есть действие, которое вернет JSON. В этом случае создайте новый JSONObject
и используйте PrintWriter
to и jsonObject.toString()
для вывода вашего JSON.
Ответ 4
GSON - довольно хорошая Java-библиотека JSON.
Ответ 5
Ты делаешь это немного сложно. Конечно, это более простой способ сделать это. Просто отправьте как обычные параметры запроса, а не как 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();
});
});