我有一个JSON字符串被发送到服务器。字符串已经是JSON格式。为什么要调用JSON。再次格式化以使其成功发送到服务器?成功意味着服务器点击并显示值,但现在它看起来像JSON。Stringify执行两次。这会在服务器上解析它时造成麻烦吗?我哪里做错了?为什么不能直接发送JSON字符串呢?
下面是ajax调用 的代码 var listsJS = this.ConvertSummaryToJSON(); // Summary Page converted to json string
$.ajax({
type: "POST",
//dataType: "JSON",
contentType: "application/json",
async: true,
data: JSON.stringify({ "summary": listsJS }),
url: GetHelper().GetVirtualDirectoryUrl() + "Reports/GenerateExcelReport"
}).done((data) => {
console.log(data);
}).fail(function () {
console.log('Failed to send');
});
this.ConvertSummaryToJSON()
返回实际的JSON字符串,看起来像这样。
{
"Summary": [{
"NewBillers": []
}, {
"Bench": [{
"FirstName": "Thomas",
"LastName": "Train"
}]
}, {
"SixtyDayRollOffs": [{
"FirstName": "Michael",
"LastName": "James"
}]
}, {
"CurrentUnassignedEmployees": [{
"Name": "Fly, Dan",
"EmployeeTitle": "Practice Director"
}]
}, {
"TotalSummaryCounts": [{
"BenchHours": "1316",
"EffectiveBench": "29",
"Contributors": "37",
"FourtyHourContributors": "14",
"AvailableBench": "26",
"EffectiveBillers": "79.533333"
}]
}]
}
如果我像之前那样调用ajax,它会到达服务器,但JSON字符串是这样的
"{"Summary":[{"NewBillers":[]},{"Bench":[{"FirstName":"Thomas", "LastName":"Train", ......."
如果我解析这个,使用JSON。净的
JObject obj = (JObject)JsonConvert.DeserializeObject(string)
我回到了我开始的地方。使用JSON字符串,但表示为JObject。这个JObject只有一个值,它是我开始使用的原始JSON字符串。
我把发送的地方弄乱了。它应该作为JSON字符串发送,而不是JSON字符串的JSON.stringify()
版本。
我已经改变了ajax调用,只有
data: {"summary": listsJS}
,但这会导致服务器抛出500 Internal Server error
并响应Invalid JSON primitive: summary
我怎么能直接从listsJS
传递JSON字符串,而不必再通过JSON.stringify()
将其传递给服务器?
如果我只使用data: listsJS
,那么它将击中服务器,但服务器上的方法中的参数将收到一个空值。
这是服务器代码的样子,也许会有帮助。
public ActionResult GenerateExcelReport(string summary)
{
var a = ExportUtility.CreateExcelSheet(summary); // <-- this just returns a literal string "Message from server"
return Json(a, JsonRequestBehavior.AllowGet);
}
我很确定我是否理解了你所有的问题,但是现在我们开始:
(1) { foo: "bar" }
是NOT一个JSON字符串。它是一个JavaScript对象。这是核心响应的JSON表示'{"foo":"bar"}'
。它们看起来非常相似,因为(我想你知道,但只是为了确定)JSON代表JavaScriptObjectNotation。这只是一个以"字符串"形式表示的约定。
(2)当你使用$.ajax
时,你不需要对你的对象进行字符串化。正如文档所述:它将"转换为查询字符串,如果还不是字符串的话"。这意味着它最终会以字符串形式出现在XHR的数据中。
(3)您(或jQuery)为您对对象进行字符串化的原因是http协议是基于文本的。否则,它将很难与不同的技术一起使用。因此,您的服务器只能获得一条"文本消息",并且必须将表单数据解析回它能理解的任何符号(与其他数据一起,例如,告诉XHR的接收者这是一个POST)。
你的问题中有一些不清楚的东西,但我要在这里猜测一下,并说你的对象两次获得JSON.stringify
d。
你发布的this.ConvertSummaryToJSON()
返回值看起来像一个JavaScript 对象不是一个JSON字符串,但我认为这是一个错误,因为对象键做看起来像它被stringized。
所以这里的事情,当您使用data: JSON.stringify({ 'summary': listsJS })
进行ajax调用时,您传递给JSON.stringify
的对象包含一个键summary
,其字符串值由listsJS
指向。当它被序列化,发送到您的服务器并反序列化时,结果与您发送的相同:一个字符串!如果您再次反序列化该字符串,您将得到所需的对象。
仅仅使用data: {"summary": listsJS}
将不工作同样的原因,你发送一个字符串和jQuery没有办法知道这个字符串是一个JSON序列化对象,所以它会很高兴地为你序列化字符串。
您需要做的就是从this.ConvertSummaryToJSON
函数返回相关对象,而不是JSON字符串。然后,您可以使用data: { 'summary': listsJS }
发送数据。
希望这对你有帮助。