как вернуть несколько объектов json из Java-сервлета, используя один запрос ajax
Я создаю веб-приложение с помощью JSP и сервлета, я отправляю запрос ajax от jsp, и я хочу вернуть два объекта json из сервлета. Я попытался сделать следующее, Но код не работает.
// в jQuery я написал этот код
var id = $(this).attr('id');
var paramenters = {"param":id};
$.getJSON("MyServlet", paramenters, function (data1,data2){
$("h3#name").text(data1["name"]);
$("span#level").text(data1["level"]);
$("span#college").text(data2["college"]);
$("span#department").text(data2["department"]);
});
/ / в сервлете я написал этот код
String json1 = new Gson().toJson(object1);
String json2 = new Gson().toJson(object2);
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
response.getWriter().write(json1);
response.getWriter().write(json2);
может кто-нибудь помочь мне???
5 ответов
вы должны сделать это так:
сервер:
String json1 = new Gson().toJson(object1);
String json2 = new Gson().toJson(object2);
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
String bothJson = "["+json1+","+json2+"]"; //Put both objects in an array of 2 elements
response.getWriter().write(bothJson);
клиентской стороне:
$.getJSON("MyServlet", paramenters, function (data){
var data1=data[0], data2=data[1]; //We get both data1 and data2 from the array
$("h3#name").text(data1["name"]);
$("span#level").text(data1["level"]);
$("span#college").text(data2["college"]);
$("span#department").text(data2["department"]);
});
надеюсь, что это помогает. Ура!--3-->
оберните их в массив JSON:
[ {..}, {..}, {..}]
или оберните их в другой объект:
{ "result1":{..}, "result2":{..} }
вы можете вернуть массив JSON с обоими объектами в качестве элементов массива. Пусть ваш сервлет вернет JSON, который имеет такую структуру:
[{"name": "object1"}, {"name": "object2"}]
тогда ваш код javascript может быть примерно таким:
$.getJSON("MyServlet", paramenters, function (data){
var data1 = data[0];
var data2 = data[1];
$("h3#name").text(data1["name"]);
$("span#level").text(data1["level"]);
$("span#college").text(data2["college"]);
$("span#department").text(data2["department"]);
});
вам нужно будет поместить оба в одну строку json, как so
response.getWriter().write("[");
response.getWriter().write(json1);
response.getWriter().write(",");
response.getWriter().write(json2);
response.getWriter().write("]");
это помещает их в массив json
вы также можете поместить их в объект JSON
response.getWriter().write("{\"object1\":");
response.getWriter().write(json1);
response.getWriter().write(",\"object2\":");
response.getWriter().write(json2);
response.getWriter().write("}");
ответ@Edgar работает для меня. Но я думаю, что мы должны избегать формирования массива самостоятельно, поэтому я предлагаю использовать список. Коды будут примерно такими:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
...
resp.setContentType("application/json");
resp.setCharacterEncoding("utf-8");
ArrayList<Object> obj_arr = new ArrayList<Object>();
obj_arr.add(obj1);
obj_arr.add(obj2);
Gson gson = new Gson();
String tmp = gson.toJson(obj_arr);
resp.getWriter().write(tmp);
}
и в передней части, для данных, которые мы получаем, мы можем использовать data[0]
заправшивать obj1
и data[1]
заправшивать obj2
. Коды будут примерно такими (я использую ajax здесь):
$('#facts_form').submit(function (e) {
e.preventDefault();
var data = new FormData(this);
var url = 'import';
$.ajax({
url: url,
type: "POST",
data: data,
processData: false,
contentType: false,
async: false,
cache: false,
success: function (data) {
for (var i = 1; i < data.length; i++){
//do whatever
}
},
error: function (xhr, status, error) {
alert(status + "\n" + error);
}
});
});