2011-05-27 48 views
7

我认为(其实我知道!)我在这里做错了一些错误,我试图将一些值填充到HashMap中,并将每个hasmap添加到将被添加到JSON对象:从Servlet返回到Javascript/JSP页面的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,但没有太多的知识。

+0

你不应该试图创建一个JSON编码的字符串;如果您的服务器端代码没有提供库函数来正确地将对象编码为JSON编码的字符串,我会感到非常惊讶。 – 2011-05-28 08:54:27

+0

[Create JSON obect并将其转换为Java中的字符串]的可能重复(http://stackoverflow.com/questions/5685613/create-json-obect-and-convert-it-to-string-in-java) – 2011-05-28 08:58:09

回答

29

它工作!我应该已经构建了JSONArrayJSONObject 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。希望这可以帮助未来的其他人。谢谢你的帮助Marcel

+0

嗨majestica - 很高兴它解决了。请将此答案标记为“已接受”。 – MByD 2011-05-28 21:25:11

+0

如何在ajax中读取,我试过'alert(responsedata.Addresses.CustomerName);' – 2016-07-11 11:19:23

+0

令人惊叹!我在GAE中使用了它,并且使用内置的'import com.google.appengine.labs.repackaged.org.json.JSONObject'包进行了很好的工作!非常感谢。 – 2017-05-27 22:27:01

1

我认为你想要做的是将JSON字符串转回到一个对象中,当它返回到你的XMLHttpRequest中时 - 对吗?

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

+0

嗨,我试过使用,我得到的是一个对象 - 请参阅此线程: http:// stackoverflow。com/questions/6153295/cant-access-property-in-returned-object 这解释了我认为返回的有效JSON。然而,它似乎是一个字符串被传回,所以我有解析它的困难 - 这就是为什么我在这里问有关尝试将JSON传递回我的JavaScript函数的问题 – majestica 2011-05-27 21:02:02

+0

问题是关于*发送*一个JSON编码的字符串,而不是如何在JavaScript中处理它。 – 2011-05-28 08:53:00

2

我用JSONObject,如下面在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); 

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,用户名