使用 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 代码。
控制台日志捕获:
我正在尝试使用 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 代码。 控制台日志捕获: