web-dev-qa-db-fra.com

Retourner la réponse JSON de servlet à la page JavaScript / JSP

Je pense (en fait je sais!) Je fais quelque chose de mal ici, j'essaie de remplir certaines valeurs dans HASHMAP et d'ajouter chaque HASMAP à une liste qui sera ajoutée à un objet 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());

Mon problème est que je sais que cela retourne une chaîne que je ne peux pas sembler analyser (qui est le problème). Ma question est de savoir comment puis-je retourner la chaîne codée JSON (ou même devrais-je le faire?) Ou quelle est la meilleure méthode d'attaque pour ce type de problème. Le JavaScript que j'utilise pour cela est ci-dessous:

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

Remarque La réponse JSON revient bien, mais c'est une chaîne. Tout conseil est grandement appréciée. J'ouvre également à utiliser Googles Gson, mais je n'ai pas trop de connaissances à ce sujet.

7
majestica

Vous avez travaillé! J'aurais dû construire un JSONArray de JSONObjects puis ajoutez la matrice à une dernière "adresses" JSONObject. Observez ce qui suit:

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

Cela a travaillé et retourné JSON valide et analysé. Espérons que cela aide quelqu'un d'autre à l'avenir. Merci pour votre aide marcel

29
majestica

J'ai utilisé JsonObject comme indiqué ci-dessous dans 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);

Le servlet renvoie cet objet JSON comme indiqué ci-dessous:

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

Ce servlet est appelé à partir du navigateur utilisant des angularjs comme ci-dessous.

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

};

Ce code a fonctionné et affiche des données correctes dans la boîte de dialogue d'alerte:

Data.header.Status: Succès

Data.header.Failurer Soin: Aucun

Data.header.detailelements: 2

Data.Element: Coma Valeurs de chaîne séparées I.E. Nhadmintree, Nom d'utilisateur

2
Rahul Varadkar