将JSON格式的字符串传递给使用JSON.NET的ajax服务器调用



我有一个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 }发送数据。

希望这对你有帮助。

相关内容

  • 没有找到相关文章

最新更新