【问题标题】:Get a Json array from a SignalR hub function as a string in javascript using signalR使用 signalR 从 SignalR 集线器函数获取 Json 数组作为 javascript 中的字符串
【发布时间】:2015-07-29 10:00:00
【问题描述】:

我正在尝试通过服务器上的函数使用 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数组

【问题讨论】:

    标签: javascript asp.net json signalr


    【解决方案1】:

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

    一个简单的例子:

    假设这是你的复杂类:

    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,或者简单的方法是包裹在自定义对象中。

    使用容器类扩展示例:

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

    作为序列化字符串发送:

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

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

    【讨论】:

    • 谢谢我知道这一点,我只是想知道为什么我没有得到standetails中的字符串或包含该字符串的对象
    • 因为默认序列化程序的行为。您可以覆盖它。在这里阅读:github.com/SignalR/SignalR/wiki/…
    • 编辑了我的答案以提供更多信息
    • 非常感谢,这正是我所需要的 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多