Restituzione della risposta JSON dalla pagina Servlet alla pagina Javascript / JSP

Penso (in realtà SO!) Sto facendo qualcosa di sbagliato qui Sto cercando di popolare alcuni valori in HashMap e aggiungo ogni hasmap ad una lista che verrà aggiunta ad un object JSON:

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()); 

Il mio problema è che so che questo sta restituendo una stringa, che non riesco a analizzare (che è il problema). La mia domanda è come restituire la stringa codificata JSON effettiva (o anche dovrei farlo?) O quale sia il miglior metodo di attacco per questo tipo di problema. Il JavaScript che sto usando per questo è qui sotto:

 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 che la risposta JSON torna bene, ma è una stringa. Qualsiasi consiglio è molto apprezzato. Sto anche aprendo all’utilizzo di Google GSON, ma non ho troppa conoscenza in merito.

Ho funzionato! Avrei dovuto creare un JSONArray di JSONObject e quindi aggiungere l’array a un “Indirizzo” finale JSONObject . Osservare quanto segue:

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

Questo ha funzionato e restituito JSON valido e analizzabile. Speriamo che questo aiuti qualcun altro in futuro. Grazie per il tuo aiuto, Marcel

Ho usato JSONObject come mostrato sotto in Servlet.

  JSONObject jsonReturn = new JSONObject(); NhAdminTree = AdminTasks.GetNeighborhoodTreeForNhAdministrator( connection, bwcon, userName); map = new HashMap(); map.put("Status", "Success"); map.put("FailureReason", "None"); map.put("DataElements", "2"); jsonReturn = new JSONObject(); jsonReturn.accumulate("Header", map); List list = new ArrayList(); list.add(NhAdminTree); list.add(userName); jsonReturn.accumulate("Elements", list); 

Il Servlet restituisce questo object JSON come mostrato di seguito:

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

Questo servlet viene chiamato dal browser utilizzando AngularJs come di seguito

 $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); }); }; 

Questo codice ha funzionato e sta visualizzando i dati corretti nella finestra di dialogo di avviso:

Data.header.status: successo

Data.header.FailureReason: Nessuno

Data.header.DetailElements: 2

Data.Elements: valori di stringa separati da Coma, ad esempio NhAdminTree, userName

Penso che quello che vuoi fare è trasformare la stringa JSON in un object quando torna in XMLHttpRequest – corretto?

In tal caso, è necessario valutare la stringa per trasformarla in un object JavaScript. Si noti che questo può essere pericoloso in quanto si ritiene che la stringa JSON non sia dannosa e pertanto esegua. Preferibilmente potresti usare jQuery’s parseJSON