как получить объекты JSON из сервлета? - PullRequest
0 голосов
/ 27 мая 2011

Я делаю простую html-программу для сервлетов, в которой мне нужно получить объект JSON из сервлета, а в html я могу получить данные, но как я могу ссылаться на каждый атрибут?

Вот сервлет get метод

    PrintWriter out=response.getWriter();
    StringBuffer emps = new StringBuffer("{employees:[");
    emps.append("{fullname:\"Abhishek Raj Simon\"},{email:\"a@a.com\"}]");
    emps.append("}");
    out.println(emps);

JS для отправки

function getJson()
{
 var url_action="/temp/jsontest";
 var form=document.forms["mainForm"];
 var splitOutput;
 var client; 
 var dataString;

 if (window.XMLHttpRequest){ 
     client=new XMLHttpRequest();
 } else {
     client=new ActiveXObject("Microsoft.XMLHTTP");
 }

 client.onreadystatechange=function(){
     if(client.readyState==4&&client.status==200)
     {
        var res=client.responseText;
        alert(res);     
        alert(client.responseText.employees.fullname); //DOES NOT WORK
        alert(client.responseText.employees.email); //DOES NOT WORK     
     }
 };

 client.open("GET",url_action,true);
 client.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
 client.send();

и простая форма

<form>
    <input type="button" value="get me some json" onclick="getJson();">
</form>

Когда я нажимаю на кнопку, я получаю только 1 предупреждение
{employees:[{fullname:"Abhishek Raj Simon"},{email:"a@a.com"}]} Как я могу получить Abhishek Raj Simon и a@a.com, используя полное имя и адрес электронной почты соответственно?

Отредактировано после прочтения поста от Артема

мой сервлет

    Gson gson = new Gson( );
    List<Employee> employees = new ArrayList<Employee>();
    Employee emp=new Employee();
    emp.setFullname("Abhishek Raj Simon");
    emp.setEmail("a@a.com");
    employees.add(emp);
    response.setContentType( "application/json");
    out.println( gson.toJson( employees));

JS часть

var res=eval('(' + client.responseText + ')');
        alert(res);     
        alert(res.employees.fullname);
        alert(res.employees.email);

Ответы [ 4 ]

3 голосов
/ 27 мая 2011

Я бы предложил вам использовать библиотеку GSON , которая позволяет вам сериализовать объект Java в json, чтобы не писать его самостоятельно.Если вы не хотите использовать GSON, есть множество других библиотек, которые используют те же возможности.

//inside your get method

Gson gson = new Gson( );
List<Employe> employees = new ArrayList<Employe>( );

// populate your list here

response.setContentType( "application/json");
response.getWriter( ).println( gson.toJson( employees));


//end

, тогда в javascript вы можете сделать то, что уже предложено в других ответах здесь.И обратите внимание на обновление типа содержимого ответа.

3 голосов
/ 27 мая 2011

Я думаю, вам следует немного изменить JSON, который вы отправляете из сервлета: {employees:[{fullname:"Abhishek Raj Simon", email:"a@a.com"}]} будет работать немного лучше в этом контексте.

Я бы порекомендовал jQuery, как советовал pap.Код был бы:

$.getJSON('/temp/jsontest', function(data) {
   var items = [];
   for (employee in data.employees) {
       items.push(employee.fullname + '<' + employee.email + '>');
   }
   alert('Employees: ' + items.join(', '));
});

На мой взгляд, это намного проще и проще для понимания, чем работа с необработанным XHR.JQuery $.getJSON сделает для вас GET, а затем оценит ответ JSON, чтобы функция была представлена ​​с хорошим представлением JSON ваших данных, которым легко манипулировать.

EDIT :

После интересного обсуждения, вот еще несколько улучшений, которые вы могли бы внести, чтобы заменить низкоуровневый код надлежащей реализацией на основе JQuery.

<script>
  $(document).ready(function() {
    $("#json-button").click(function() {
      $.getJSON('/temp/jsontest', function(data) {
        var items = [];
          for (employee in data.employees) {
            items.push(employee.fullname + '<' + employee.email + '>');
          }
          alert('Employees: ' + items.join(', '));
      });
    });
  });
</script>

<form>
    <input id="json-button" type="button" value="get me some json">
</form>
1 голос
/ 27 мая 2011

Это потому, что вы получаете строку JSON, но не конвертируете ее в объект JSON.Есть функция eval(), которая оценивает вашу строку JSON и возвращает объект JSON.

Следующий пример должен работать (хотя и не тестироваться).

if(client.readyState==4&&client.status==200)
     {
        var res=eval('(' + client.responseText; + ')');
        alert(res);     
        alert(res.employees[0].fullname);
        alert(res.employees[0].email);   
     }

ПРЕДУПРЕЖДЕНИЕ : я предлагаю прочитать вопросы безопасности при использовании eval().Либо перейдите на JSON.org и загрузите Javascript JSON-анализатор или используйте вместо него JQuery .

1 голос
/ 27 мая 2011
var res=client.responseText;
var temp = 'resObj=' + res;
eval(temp);
alert(resObj.employees.fullname);

JSON - это просто текст, но в синтаксисе JavaScript.Вам нужно передать его через метод «eval», который будет оценивать и выполнять текст как javascript.

Мой совет, однако, заключается в том, чтобы использовать jQuery или какую-либо другую инфраструктуру javascript, чтобы не связываться со всем этим котлом.-платина javascript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...