我在C#中定义了一种类型,称为
using Message = System.Collections.Generic.Dictionary<string, object>;
我把这个从C#服务器发送到C#客户端没有问题。
但现在他们希望其中一个值对是Message数组,如下所示(跟踪的变量带有伪值):
Message msg = new Message();
msg.Add("timestamp", Tools.ToMS(seconds, microseconds));
msg.Add("DateTime", Tools.ToISO(this.seconds, this.microseconds));
msg.Add("guid", Guid.NewGuid().ToString());
msg.Add("heading", this.heading);
msg.Add("correction", this.correction);
msg.Add("valid", this.valid);
msg.Add("lat", lat);
msg.Add("lon", lon);
msg.Add("altitude", altitude);
msg.Add("Channel", "Oxford.GPS");
Message[] tracked = new Message[2];
tracked[0] = new Message();
tracked[1] = new Message();
tracked[0].Add("first", 1);
tracked[1].Add("second", 2);
msg.Add("tracked", tracked);
return msg;
好的,我在发送时没有错误,但在接收端,嵌入的Dictionary没有转换为Dictionary,相反,我得到了Newtonsoft.Json.Linq.JArray 的数组
Type: Object
HasValues: 1
First: [1x1 Newtonsoft.Json.Linq.JProperty]
Last: [1x1 Newtonsoft.Json.Linq.JProperty]
Count: 1
Parent: [1x1 Newtonsoft.Json.Linq.JArray]
Root: [1x1 Newtonsoft.Json.Linq.JArray]
Next: [1x1 Newtonsoft.Json.Linq.JObject]
Previous: []
Path: [1x1 System.String]
以下是到达客户的详细跟踪显示,在我未经训练的眼中,这看起来很好:
{"C":"d-4A172629-B,5549|C,0|D,1","M":[{"H":"GatewayHub","M":"post","A":[{"timestamp":1450469910308,"DateTime":"2015-12-18T20:18:30.3090000Z","guid":"60ef4307-1225-40f9-b0e0-f2f1d87e760d","heading":210.340958,"correction":3,"valid":true,"lat":42.299856271140619,"lon":-83.698864895162188,"altitude":269.147216796875,"Channel":"Oxford.GPS","tracked":[{"first":1},{"second":2}]}]}]})
是的,信不信由你,我会通过一个事件将其发送到Matlab,它也可以工作,但不适用于嵌套值。
由于我的目标只是在单独的机器上从"服务器"框->Matlab客户端的传感器驱动程序(写为dll)传递值,所以我改变了这样做的方式。
我使用动态C#类型获取二进制结构值,并将其提供给SignalR内部的JSON.NET。这是一个足够有效的编码。
然后我可以做一个:
proxy.On<string, dynamic>("post2", (chan, pkt) =>
{
Console.WriteLine("channel: " + chan);
pkt.channel = chan;
trigger2(pkt);
});
并在嵌入式C#dll(嵌入Matlab)中获取数据。我触发一个事件(最后一行),并将完整的JSON.NET对象发送到Matlab,然后Matlab可以使用.SelectToken()获取值。
我觉得这很整洁,你可以说它很丑,我不会哭。