web-dev-qa-db-ja.com

サーブレットから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レスポンスは正常に返されますが、文字列であることに注意してください。アドバイスは大歓迎です。また、Google Gsonを使用することもできますが、そのことについてあまり知識がありません。

7
majestica

うまくいきました! JSONArray of JSONObjectsを構築してから、配列を最後の「アドレス」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を返しました。うまくいけば、これは将来的に誰かを助けるでしょう。助けてくれてありがとうマルセル

29
majestica

以下のようにサーブレットで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());

このサーブレットは、以下のようにAngularJを使用してブラウザから呼び出されます

$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

2
Rahul Varadkar

あなたがやりたいのは、JSON文字列がXMLHttpRequestに戻ってきたらオブジェクトに戻すことだと思います-正しいですか?

もしそうなら、あなたはそれをJavaScriptオブジェクトに変えるために eval 文字列にする必要があります-JSON文字列が悪意のないものであると信頼していてそれを実行するので、これは安全ではないかもしれないことに注意してください。できれば、jQueryの parseJSON を使用できます。

1
tinyd