Ajax und zugriff auf ein JSON Objekt

BlubBlub

Mitglied
Hi wie kann man mit Ajax auf ein Array zugreifen, dass man sich vom Servlet holt?
Hab versucht ein JSON Objekt zu verschicken und auf der Clientseite auszugeben aber es klappt nicht.

JavaScript
Code:
$.ajax({
							type: "POST",
							url: zielUrl,
							data: {wanted:"einArray"},													
							cache:false,
							dataType: "json",
							
							success: function(data)	 												
							{
                                                             var AnArray = eval('('+data+')');
                                                             alert(AnArray[0]);
                                                        }
            });


Servlet
Code:
  protected void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException 
  {
            PrintWriter out = response.getWriter();
            response.setContentType("application/json");
            out.println("{'meinArray':['Zitrone','Banane','Orange']}");
             out.close();
 }
 
1. Wenn du "dataType" auf JSON setzt, bekommst du automatisch das Objekt zurück (und keinen String). Das ist auch hier dokumentiert: http://api.jquery.com/jQuery.ajax/

2. Selbst wenn du einen String bekämst, solltest du nicht eval nehmen, sondern jQuery.parseJSON (wird von jQuery.ajax benutzt, wenn dataType=json, siehe verlinkte Dokumentation und hier http://api.jquery.com/jQuery.parseJSON/).

3. Wieso greifst du direkt als Array darauf zu? Du musst doch erst mal auf das Attribut "meinArray" zugreifen, welches dann das Array enthält.

4. Das ist kein valides JSON (Doppelte Anführungsstriche), was jQuery in neueren Versionen nicht mehr akzeptiert.


Also wenn du 4. korrigierst, musst du einfach deinen Code so abändern.

Javascript:
success: function(data)                                                 
{
    alert(data.meinArray[0]);
}
 
Code:
$.ajax({
                            type: "POST",
                            url: zielUrl,
                            data: {wanted:"einArray"},                                                  
                            cache:false,
                            dataType: "json",
                            
                            success: function(data)                                                 
                            {
                                                             var AnArray = data.meinArray;
                                                             alert(AnArray[0]);
                                                        }
            });


Code:
 protected void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException 
  {
            PrintWriter out = response.getWriter();
            response.setContentType("application/json");
             out.println("{\"meinArray\":[\"Zitrone\",\"Banane\",\"Orange\"]}");
             out.close();
 }

Okay, danke die Lösung funktioniert jetzt.
Aber mir gefällt es nicht, dass ich das JSON Objekt vom Servlet aus wie einen String verschicke.
Gibt es die Möglichkeit auf der Servlet Seite irgendwie ein Objekt vom Typ JSON zu erzeugen oder so, welches man dann dynamisch füllen kann und dann verschicken kann?
Im Pseudocode so:

Code:
 protected void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException 
  {
            PrintWriter out = response.getWriter();
            response.setContentType("application/json");

             JSONObjetk meinArray = new JSONObjekt();
             meinArray.put("Zitrone");
             meinArray.put("Banane");
             meinArray.put("Orange");
             out.println(meinArray);
             
            out.close();
 }

oder kann man irgendwie direkt ein Array verschicken
Code:
 protected void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException 
  {
            PrintWriter out = response.getWriter();
            response.setContentType("application/json");

             String[] meinArray = {"Zitrone", "Banane", "Orange"};
             out.println(meinArray);
             
            out.close();
 }
 
Zurück