如何使用数组和字符串参数进行Ajax调用

我想用数组值和sting参数对我的服务器进行ajax调用。

这是我在我的页面中使用的function。

var globalArray = []; function submit() { var string_MyVal, jsonBody, string_MyVal1, string_MyVal2, string_MyNameVal, string_MyNameDesc, string_MyNameFlag; string_MyVal1 = 150; string_MyVal = "sel.html"; string_MyVal2 = "string_MyVal2"; string_MyNameVal = "string_MyNameVal"; string_MyNameDesc ="string_MyNameDesc"; string_MyNameFlag = "private"; jsonBody = 'storedSelections=' + globalArray + '&string_MyVal='+ string_MyVal + '&string_MyVal1='+ string_MyVal1 + '&string_MyVal2='+ string_MyVal2 + '&string_MyNameVal=' + string_MyNameVal + '&string_MyNameDesc='+ string_MyNameDesc + '&string_MyNameFlag=' + string_MyNameFlag; $.ajax({ async : false, type : "POST", url : 'http://example.com:8080/myApp/DataServlet', data : jsonBody, success : function(data) { setToken(data); }, error : function(data, status, er) { alert("error: " + data + " status: " + status + " er:" + er); } }); } 

在我的servlet中,这个globalArray只是“对象对象”。 该数组中有更多内容..

如何将此数组和字符串值传递给我的servlet。

我知道用JSON.stringify解决了这个问题,

 var selections = JSON.stringify(globalSelection); alert(selections 

这有效,数据显示如下,

 [{"range":{},"type":3,"rCollection":[{"range":{},"node":{},"tagName":"P","tagIndex":2,"data":"lot%20","nodeType":3,"sIdx":14,"eIdx":18,"fontColor":"yellow","bgColor":"green"}],"textContent":"lot%20","anchorNode":{},"focusNode":{},"selectionId":181862,"yPOS":0}] 

但这不支持safari和iOS。

任何人都可以在这里协助如何将我的数组值与相同的ajax调用中的字符串值一起传递给servlet。

编辑:

这是我试过的更新,

 function textSelection(range, anchorNode, focusNode) { this.range = range; this.type = 3; this.rCollection = []; this.textContent = encodeURI(range.toString()); this.anchorNode = anchorNode; this.focusNode = focusNode; this.selectionId = getRandom(); this.yPOS = getYPOS(); this.getTagName = function(range) { var el = range.startContainer.parentNode; return el; } this.getTagIndex = function(el) { var index = $(el.tagName).index(el); return index; } this.simpleText = function(node, range) { if (!node) var entry = this.createEntry(this.anchorNode, this.range); else var entry = this.createEntry(node, range); this.rCollection.push(entry); this.highlight(this.rCollection[0].range); this.crossIndexCalc(); textSelection._t_list.push(this); pushto_G_FactualEntry(this); } this.compositeText = function() { this.findSelectionDirection(); var flag = this.splitRanges(this.anchorNode, this.focusNode, this.range.startOffset, this.range.endOffset); if (flag == 0) { for (j in this.rCollection) { this.highlight(this.rCollection[j].range); } } this.crossIndexCalc(); textSelection._t_list.push(this); pushto_G_FactualEntry(this); } this.toJSON = function() { return {range: this.range}; } } 

在globalSelection中,我有上面textSelection的元素。 我建议将jSON添加到此处。

现在我在控制台中得到如下结果,

 [{"range":{}}] 

这是空的价值……

Javascript提供了序列化的方法:

 toJSON() 

此函数用于定义应该成为序列化的一部分。 基本上,您可以创建要序列化的对象的克隆,不包括循环依赖项或不应发送到服务器的数据。

有关此行为的更多信息,请访问: https : //developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#toJSON()_behavior

 JSON.stringify() 

此函数调用toJSON()并序列化返回的对象。

例:

 var objectToSend = {}; objectToSend.varX = 5; objectToSend.varY = 10; objectToSend.toJSON = function() { return {varX: this.varX}; } var jsonString = JSON.stringify(objectToSend); 

结果将是:

 "{"varX":5}" 

如果您正在编写客户端和服务器实现,那么我建议您将数据创建为JSON对象,然后使用base64编码将JSON对象转换为可以作为一个编码参数发送的字符串:

  encodededjson=(BASE 64 encoded JSON here) 

然后在服务器上,您只需使用等效的base 64解码例程将编码数据转换回JSON。 所以你使用:

  var strJSON = JSON.stringify(globalSelection); 

并将结果传递给base64编码例程,然后使用该结果构建您的Post:

  var strJSON = JSON.stringify(globalSelection); ,strEncoded = Base64.encodeBase64(new String(strJSON.getBytes())) ,strPost = "datatopost=" + strEncoded;