2011-05-27 36 views
7

Creo (de hecho, lo sé) Estoy haciendo algo mal aquí Estoy intentando completar algunos valores en HashMap y agregar cada mapa de uso a una lista que se agregará a un JSON objeto:Devolver la respuesta JSON de Servlet a la página Javascript/JSP

JSONObject json = new JSONObject(); 
try 
{ 
    Map address; 
    List addresses = new ArrayList(); 

    int count = 15; 

    for (int i=0 ; i<count ; i++) 
    { 
     address = new HashMap(); 
     address.put("CustomerName"  , "Decepticons" + i); 
     address.put("AccountId"  , "1999" + i); 
     address.put("SiteId"   , "1888" + i); 
     address.put("Number"   , "7" + i); 
     address.put("Building"   , "StarScream Skyscraper" + i); 
     address.put("Street"   , "Devestator Avenue" + i); 
     address.put("City"    , "Megatron City" + i); 
     address.put("ZipCode"   , "ZZ00 XX1" + i); 
     address.put("Country"   , "CyberTron" + i); 
     addresses.add(address); 
    } 
    json.put("Addresses", addresses); 
} 
catch (JSONException jse) 
{ 

} 
response.setContentType("application/json"); 
response.getWriter().write(json.toString()); 

Mi problema es que sé que esto está volviendo una cadena, que parece que no puede I a analizar (que es el problema). Mi pregunta es ¿cómo devuelvo la cadena codificada en JSON real (o incluso debería estar haciendo esto?) O cuál es el mejor método de ataque para este tipo de problema. El código JavaScript que estoy utilizando para esto es a continuación:

function getReadyStateHandler(req) 
{ 
    // Return an anonymous function that listens to the 
    // XMLHttpRequest instance 
    return function() 
    { 
     // If the request's status is "complete" 
     if (req.readyState == 4) 
     { 
      // Check that a successful server response was received 
      if (req.status == 200) 
      { 
       msgBox("JSON Response recieved..."); 
       populateDatagrid(req.responseText.toJSON()); 
      } 
      else 
      { 
       // An HTTP problem has occurred 
       alert("HTTP error: " + req.status); 
      } 
     } 
    } 
} 

Nota la respuesta JSON vuelve fina, pero es una cadena. Cualquier consejo es muy apreciado. También estoy empezando a usar Google Gson, pero no tengo mucho conocimiento sobre eso.

+0

Usted no debe tratar de crear un JSON cadena codificada usted mismo; Me sorprendería mucho que su código del lado del servidor no proporcione una función de biblioteca para codificar correctamente un objeto en una cadena codificada JSON. –

+0

posible duplicado de [Crear JSON obect y convertirlo a String en Java] (http://stackoverflow.com/questions/5685613/create-json-obect-and-convert-it-to-string-in-java) –

Respuesta

29

¡Lo tengo funcionando! Debería haber estado construyendo un JSONArray de JSONObject sy luego agregar el arreglo a una "Dirección" final JSONObject. Observe lo siguiente:

JSONObject json  = new JSONObject(); 
JSONArray addresses = new JSONArray(); 
JSONObject address; 
try 
{ 
    int count = 15; 

    for (int i=0 ; i<count ; i++) 
    { 
     address = new JSONObject(); 
     address.put("CustomerName"  , "Decepticons" + i); 
     address.put("AccountId"  , "1999" + i); 
     address.put("SiteId"   , "1888" + i); 
     address.put("Number"   , "7" + i); 
     address.put("Building"   , "StarScream Skyscraper" + i); 
     address.put("Street"   , "Devestator Avenue" + i); 
     address.put("City"    , "Megatron City" + i); 
     address.put("ZipCode"   , "ZZ00 XX1" + i); 
     address.put("Country"   , "CyberTron" + i); 
     addresses.add(address); 
    } 
    json.put("Addresses", addresses); 
} 
catch (JSONException jse) 
{ 

} 
response.setContentType("application/json"); 
response.getWriter().write(json.toString()); 

Esto funcionó y devolvió JSON válido y analizable. Esperemos que esto ayude a alguien más en el futuro. Gracias por su ayuda Marcel

+0

Hola, majestica, me alegro de que esté resuelto. por favor marque esta respuesta o la otra como "aceptada". – MByD

+0

Cómo leer esto en ajax, probé 'alert (responsedata.Addresses.CustomerName);' –

+0

¡Increíble! Lo utilicé con GAE y funcionó perfectamente con el paquete 'import com.google.appengine.labs.repackaged.org.json.JSONObject' incorporado. Muchas gracias. –

1

Creo que lo que quiere hacer es volver a convertir la cadena JSON en un objeto cuando vuelva a su XMLHttpRequest - ¿correcto?

Si es así, necesita eval la cadena para convertirlo en un objeto JavaScript; tenga en cuenta que esto puede ser inseguro ya que está confiando en que la cadena JSON no es maliciosa y por lo tanto la está ejecutando. Preferiblemente, podría usar jQuery's parseJSON

+0

Hola, he intentado usar eso y todo lo que obtengo es un objeto de nuevo. Consulte este hilo: http: // stackoverflow.com/questions/6153295/cant-access-property-in-returned-object Esto explica lo que pensé que era JSON válido devuelto. Sin embargo, parece que de hecho se transmitió una cadena, por lo que estoy teniendo problemas para analizarla, por lo que estoy aquí haciendo la pregunta relativa a intentar pasar JSON a mi función de JavaScript – majestica

+0

La pregunta es sobre * enviar * una cadena codificada JSON, no sobre cómo procesarla en JavaScript. –

2

He usado JSONObject como se muestra a continuación en Servlet.

JSONObject jsonReturn = new JSONObject(); 

    NhAdminTree = AdminTasks.GetNeighborhoodTreeForNhAdministrator(connection, bwcon, userName); 

    map = new HashMap<String, String>(); 
    map.put("Status", "Success"); 
    map.put("FailureReason", "None"); 
    map.put("DataElements", "2"); 

    jsonReturn = new JSONObject(); 
    jsonReturn.accumulate("Header", map); 

    List<String> list = new ArrayList<String>(); 
    list.add(NhAdminTree); 
    list.add(userName); 

    jsonReturn.accumulate("Elements", list); 

El servlet devuelve este objeto JSON como se muestra a continuación:

response.setContentType("application/json"); 
    response.getWriter().write(jsonReturn.toString()); 

este servlet se llama desde el navegador usando AngularJS como a continuación

$scope.GetNeighborhoodTreeUsingPost = function(){ 
    alert("Clicked GetNeighborhoodTreeUsingPost : " + $scope.userName); 

    $http({ 

     method: 'POST', 
     url : 'http://localhost:8080/EPortal/xlEPortalService', 
     headers: { 
      'Content-Type': 'application/json' 
     }, 
     data : { 
      'action': 64, 
      'userName' : $scope.userName 
     } 
    }).success(function(data, status, headers, config){ 
     alert("DATA.header.status : " + data.Header.Status); 
     alert("DATA.header.FailureReason : " + data.Header.FailureReason); 
     alert("DATA.header.DataElements : " + data.Header.DataElements); 
     alert("DATA.elements : " + data.Elements); 

    }).error(function(data, status, headers, config) { 
     alert(data + " : " + status + " : " + headers + " : " + config); 
    }); 

}; 

Este código funcionaba y está mostrando los datos correctos en el cuadro de diálogo de alerta:

Data.header.status: Success

Data.header.FailureReason: Ninguno

Data.header.DetailElements: 2

Data.Elements: Coma separados, es decir, los valores de cadena NhAdminTree, nombre de usuario

Cuestiones relacionadas