【问题标题】:Returning JSON response from Servlet to Javascript/JSP page将 JSON 响应从 Servlet 返回到 Javascript/JSP 页面
【发布时间】:2011-05-27 16:01:44
【问题描述】:

我认为(实际上我知道!)我在这里做错了我正在尝试将一些值填充到 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 响应可以正常返回,但它是一个字符串。任何意见是极大的赞赏。我也愿意使用谷歌 Gson,但对此没有太多了解。

【问题讨论】:

  • 你不应该尝试自己创建一个 JSON 编码的字符串;如果您的服务器端代码没有提供库函数来将对象正确编码为 JSON 编码字符串,我会感到非常惊讶。

标签: java json gson


【解决方案1】:

搞定了!我应该构建JSONObjects 的JSONArray,然后将数组添加到最终的“地址”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。希望这对将来的其他人有所帮助。感谢您的帮助马塞尔

【讨论】:

  • 怎么用ajax读这个,我试过alert(responsedata.Addresses.CustomerName);
  • 太棒了!我将它与 GAE 一起使用,并且与内置的 import com.google.appengine.labs.repackaged.org.json.JSONObject 包一起工作得很好!非常感谢。
【解决方案2】:

我在 Servlet 中使用了如下所示的 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);

Servlet 返回这个 JSON 对象,如下所示:

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

这个 Servlet 是使用 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、用户名

【讨论】:

    【解决方案3】:

    我认为您想要做的是在 JSON 字符串返回您的 XMLHttpRequest 时将其转换回一个对象 - 对吗?

    如果是这样,您需要 eval 将字符串转换为 JavaScript 对象 - 请注意,这可能是不安全的,因为您相信 JSON 字符串没有恶意并因此执行它。最好你可以使用 jQuery 的 parseJSON

    【讨论】:

    • 嗨,我已经尝试过使用它,但我得到的只是一个对象返回 - 请参阅此线程:stackoverflow.com/questions/6153295/… 这解释了我认为返回的有效 JSON。但是,它似乎实际上是一个被传回的字符串,所以我很难解析它 - 这就是为什么我在这里提出与尝试将 JSON 传递回我的 JavaScript 函数有关的问题
    • 问题是关于发送一个 JSON 编码的字符串,而不是关于如何在 JavaScript 中处理它。
    猜你喜欢
    • 1970-01-01
    • 2018-12-17
    • 2012-08-08
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 2011-05-14
    相关资源
    最近更新 更多