Возврат ответа JSON из сервлета на страницу Javascript / JSP - PullRequest
7 голосов
/ 27 мая 2011

Я думаю (на самом деле я ЗНАЮ!) Я делаю что-то не так, здесь я пытаюсь заполнить некоторые значения в HashMap и добавить каждый hasmap в список, который будет добавлен в объект 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());

Моя проблема в том, что я знаю, что это возвращает строку, которую я не могу разобрать (что является проблемой).Мой вопрос заключается в том, как мне вернуть фактическую строку в кодировке JSON (или даже я должен это делать?) Или каков наилучший метод атаки для такого типа проблемы.JavaScript, который я использую для этого, приведен ниже:

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

Обратите внимание, что JSON Response возвращается нормально, но это строка.Любые советы высоко ценится.Я также открываю для использования Google Gson, но не слишком много знаний об этом.

Ответы [ 3 ]

29 голосов
/ 28 мая 2011

Работай! Я должен был создать JSONArray из JSONObject s, а затем добавить массив к окончательному «Адресу» JSONObject. Обратите внимание на следующее:

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

Это сработало и вернуло действительный и анализируемый JSON. Надеюсь, это поможет кому-то еще в будущем. Спасибо за помощь Марсель

2 голосов
/ 20 мая 2017

Я использовал JSONObject, как показано ниже в сервлете.

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

Сервлет возвращает этот объект JSON, как показано ниже:

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

Этот сервлет вызывается из браузера с помощью AngularJs, как показано ниже

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

};

Этот код сработал, и в диалоговом окне предупреждения отображаются правильные данные:

Data.header.status: успех

Data.header.FailureReason: нет

Data.header.DetailElements: 2

Data.Elements: строковые значения, разделенные запятой, т.е. NhAdminTree, userName

1 голос
/ 27 мая 2011

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

Если это так, вам нужно eval строки, чтобы превратить ее в объект JavaScript - обратите внимание, что это может быть небезопасно, поскольку вы полагаете, что строка JSON не является вредоносной, и, следовательно, ее выполняете. Предпочтительно вы можете использовать jQuery parseJSON

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