使用 signalR 从 SignalR 集线器函数获取 Json 数组作为 javascript 中的字符串

Get a Json array from a SignalR hub function as a string in javascript using signalR

我正在尝试使用 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();

这是我从这个函数得到的结果:

{[{"ResponseCode":"","NodeName":"Test"},  {"ResponseCode":"00","NodeName":"Test"}]} 

我的 javascript 代码是:

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

浏览器中standetails的类型是object,不包含json数组

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

一个简单的例子:

假设这是你的情结 class:

public class TestData {
    public string p1 { get; set; }
    public string p2 { get; set; }
    public DateTime p3 { get; set; }
}

让我们创建一个简单的方法来创建一个列表并发送

public class TestHub : Hub {
    public void Send(string name, string message) {
        List<TestData> testList = new List<TestData>();

        testList.Add(new TestData { p1 = "AAA", p2 = "BBB", p3 = DateTime.Now });
        testList.Add(new 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);
}

这里的测试是一个包含两个对象的数组,请参见图片。 希望对您有所帮助。

编辑

如果你想改变默认的序列化器行为,你可以通过replacing the default JsonSerializer used,或者简单的方法是包装自定义对象。

使用容器扩展示例 class:

public class Container {
    public string value { get; set; }
}

作为序列化字符串发送:

Clients.All.sendMessage(new Container { value = new JavaScriptSerializer().Serialize(testList) });

收到相同的 javascript 代码。 控制台日志捕获: