2011-05-27 94 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,用戶名