当前位置: 首页 > 面试题库 >

MVC:如何将字符串返回为JSON

郭志泽
2023-03-14
问题内容

为了使进度报告过程更加可靠,并使它与请求/响应脱钩,我正在Windows
Service中执行处理,并将预期的响应持久化到文件中。当客户端开始轮询更新时,其目的是控制器以JSON字符串形式返回文件的内容(无论它们是什么)。

该文件的内容已预序列化为JSON。这是为了确保在响应过程中没有任何阻碍。无需进行任何处理(只需将文件内容读入字符串并返回)即可获得响应。

我最初虽然很简单,但事实并非如此。

当前,我的控制器方法因此看起来:

更新

[HttpPost]
public JsonResult UpdateBatchSearchMembers()
{
    string path = Properties.Settings.Default.ResponsePath;
    string returntext;
    if (!System.IO.File.Exists(path))
        returntext = Properties.Settings.Default.EmptyBatchSearchUpdate;
    else
        returntext = System.IO.File.ReadAllText(path);

    return this.Json(returntext);
}

Fiddler将此作为原始响应返回

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Mon, 19 Mar 2012 20:30:05 GMT
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 3.0
Cache-Control: private
Content-Type: application/json; charset=utf-8
Content-Length: 81
Connection: Close

"{\"StopPolling\":false,\"BatchSearchProgressReports\":[],\"MemberStatuses\":[]}"

AJAX

更新

以下内容可能会在以后更改,但是目前,当我生成响应类并将其作为JSON像普通人一样返回时,此方法已经起作用。

this.CheckForUpdate = function () {
var parent = this;

if (this.BatchSearchId != null && WorkflowState.SelectedSearchList != "") {
    showAjaxLoader = false;
    if (progressPending != true) {
        progressPending = true;
        $.ajax({
            url: WorkflowState.UpdateBatchLink + "?SearchListID=" + WorkflowState.SelectedSearchList,
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            cache: false,
            success: function (data) {
                for (var i = 0; i < data.MemberStatuses.length; i++) {
                    var response = data.MemberStatuses[i];
                    parent.UpdateCellStatus(response);
                }
                if (data.StopPolling = true) {
                    parent.StopPullingForUpdates();
                }
                showAjaxLoader = true;
            }
        });
        progressPending = false;
    }
}

问题答案:

我认为,问题在于Json操作结果旨在获取一个对象(您的模型)并创建一个HTTP响应,其中包含来自模型对象的JSON格式的数据。

不过,您传递给控制器​​的Json方法的是一个JSON格式的 字符串对象 ,因此它将 字符串对象
“序列化”为JSON,这就是HTTP响应的内容被双引号引起来的原因(I’ m假设是问题所在)。

我想您可以考虑使用Content动作结果作为Json动作结果的替代方法,因为您实际上已经有了HTTP响应的原始内容。

return this.Content(returntext, "application/json");
// not sure off-hand if you should also specify "charset=utf-8" here, 
//  or if that is done automatically

另一个选择是将服务中的JSON结果反序列化为一个对象,然后将该对象传递给控制器​​的Json方法,但是缺点是您将反序列化然后重新序列化数据,这可能是不必要的为了您的目的。



 类似资料:
  • 问题内容: 在我的AJAX调用中,我想将字符串值返回到调用页面。 我应该使用还是返回一个字符串? 问题答案: 您可以使用返回一个纯字符串: 默认情况下返回a 作为其contentType。这是可重载的,因此您还可以执行以下操作:

  • 我有一个Spring MVC控制器,方法如下: 它位于一个开始如下所示的控制器内部: 我使用的是Spring WebMVC 4.1.3和Jackson 2.4.3。我尝试在RequestMapping中添加一个“produces”属性,表示它应该返回JSON。在本例中,发回的Content-Type属性是“application/json”,但仍然没有引用测试字符串。 我可以通过调用JSON库将J

  • 问题内容: 为了转换字符串,我将其转换为字节,如下所示: 为了转换,我做了:显然不起作用。我将如何转换回去? 问题答案: 您原来的城市名称中有哪些字符?尝试这样的UTF-8版本:

  • 我希望自动将对象序列化为JSON的便利性和返回原始JSON字符串的能力。我正在使用Gson而不是Jackson,因为Gson已经在我的应用程序中有一段时间了,我有现有的调整,转换器,和注释遍布我的应用程序。 我可以自动序列化POJO的: 我希望这也能奏效: 现在的结果是一个转义值: 而不是:

  • 处理JSP页时发生异常。第62行 后来呢 bean名称'command'的BindingResult和普通目标对象都不能作为请求属性使用

  • 我的问题实质上是对这个问题的跟进。 在上面,Spring会将“hello world”添加到响应体中。如何将字符串作为JSON响应返回?我知道我可以加引号,但这感觉更像是一个黑客。 请提供任何例子来帮助解释这一概念。 注意:我不想直接写到HTTP响应体,我想返回JSON格式的字符串(我正在使用带有RestyGWT的控制器,它要求响应是有效的JSON格式)。