使用signer从signarhub函数获取Json数组,作为javascript中的字符串

使用signer从signarhub函数获取Json数组,作为javascript中的字符串,javascript,asp.net,json,signalr,Javascript,Asp.net,Json,Signalr,我试图通过服务器上使用signalR的函数获取一个json数组作为字符串,但我一直获取一个对象而不是字符串。 这是编写json数组的代码 SqlDataReader reader = cmd.ExecuteReader(); StringBuilder sb = new StringBuilder(); StringWriter sw = new StringWriter(sb); using (JsonWriter jsonWriter = new JsonTextWriter(sw)) {

我试图通过服务器上使用signalR的函数获取一个json数组作为字符串,但我一直获取一个对象而不是字符串。 这是编写json数组的代码

SqlDataReader reader = cmd.ExecuteReader();
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
using (JsonWriter jsonWriter = new JsonTextWriter(sw))
{
    jsonWriter.WriteStartArray();
    while (reader.Read())
    {
        jsonWriter.WriteStartObject();
        int fields = reader.FieldCount;

        for (int i = 0; i < fields; i++)
        {
            jsonWriter.WritePropertyName(reader.GetName(i));
            jsonWriter.WriteValue(reader[i]);
        }

        jsonWriter.WriteEndObject();

    }
    jsonWriter.WriteEndArray();
}
reader.Close();
con.Close();

return sb.ToString();
我的javascript代码是:

var standetails = hub.server.stanDetails($(this).textContent);
//var x = JSON.parse(standetails)

浏览器中的标准细节类型是
对象
,不包含json数组

,比您想象的要简单得多。信号器将序列化作为参数从服务器发送到JS客户端的自定义对象。 这意味着您实际上可以发送一个复杂对象列表,并在JS端获得一个数组

一个简单的例子:

假设这是您的复杂类:

公共类TestData{
公共字符串p1{get;set;}
公共字符串p2{get;set;}
公共日期时间p3{get;set;}
}
让我们制作一个简单的方法,创建一个列表并发送

公共类TestHub:Hub{
公共无效发送(字符串名称、字符串消息){
List testList=新列表();
Add(新的TestData{p1=“AAA”,p2=“BBB”,p3=DateTime.Now});
添加(新的TestData{p1=“CCC”,p2=“DDD”,p3=DateTime.Now});
Clients.All.sendMessage(testList);
}
}
接收此事件的javascript:

var hub = $.connection.testHub;

hub.client.sendMessage = function (param) {
    console.log(param);
}
这里的测试是一个包含两个对象的数组,请参见图中的。 我希望这有帮助

编辑

如果您想更改默认的序列化程序行为,您可以选择,或者简单的方法是使用自定义对象进行包装

使用容器类扩展示例:

public class Container {
    public string value { get; set; }
}
以序列化字符串形式发送:

Clients.All.sendMessage(new Container { value = new JavaScriptSerializer().Serialize(testList) });
接收相同的javascript代码。 控制台日志捕获:


谢谢,我知道这一点,我只是想知道为什么在
standetails
中由于默认序列化程序的行为而无法获取字符串或包含字符串的对象。你可以覆盖它。阅读此处:。编辑我的答案以提供更多信息非常感谢这正是我所需要的:)
Clients.All.sendMessage(new Container { value = new JavaScriptSerializer().Serialize(testList) });