信号器发送嵌套的键/值字典

时间:2016-04-08 17:47:22

标签: json.net signalr

我在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;

好的,我在发送时没有错误,但在接收端嵌入式词典没有转换为字典,而是我得到一个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,这也适用于嵌套值。

1 个答案:

答案 0 :(得分:0)

由于我的目标仅仅是从“服务器”框传递来自传感器驱动程序(写为dll)的值 - &gt;在单独的机器上的Matlab客户端,我已经改变了我的方式。

我正在使用二进制struct值,使用动态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()来获取值。

我认为这很整洁,你可以称之为丑陋,我不会哭。