【问题标题】:socket.io emit to C# using Newtonsoft.json and socketIOClientsocket.io 使用 Newtonsoft.json 和 socketIOClient 发送到 C#
【发布时间】:2012-05-17 10:28:40
【问题描述】:

nodeJS:

io.sockets.on("connection",function(client)
{
  client.emit('Value',{Data:'a string'});
});

C#:

socket.On("Value", (data) =>
{
  PlainString PS = data.Json.GetFirstArgAs<PlainString>();
  MessageBox.Show(PS.Data);
});

C# 纯字符串类:

[JsonObject(MemberSerialization.OptIn)]
class PlainString
{
   [JsonProperty]
   public string Data { get; set; }
   public PlainString(){}
   public string ToJsonString()
   {
     return JsonConvert.SerializeObject(this);
   }
   public static PlainString Deserialize(string jsonString)
   {
      return JsonConvert.DeserializeObject<PlainString>(jsonString);
   }
}

错误:

无法将类型“object”隐式转换为“PlainString”。 存在显式转换(您是否缺少演员表?)

关于 JsonEncodedEventMessage.cs:39

    public T GetFirstArgAs<T>()
        {
            try
            {
                var firstArg = this.Args.FirstOrDefault();
                if (firstArg != null)
                return JsonConvert.DeserializeObject<T>(firstArg.ToString());//line 39
            }
            catch (Exception ex)
            {
                throw;
            }
            return default(T);
        }

firstArg = '{ "Data": "connected" }' (dynamic)T = PlainString

使用:SocketIO4Net

一切看起来都正确,但我总是收到那个错误,我错过了什么吗?

【问题讨论】:

  • 包含“return JsonConvert.DeserializeObject...”的方法的返回类型是什么?这个返回类型不是 T,这是导致错误的原因。

标签: c# node.js type-conversion socket.io json


【解决方案1】:

我不知道那个库,但通常反序列化器返回对象。

试试这个:

public static PlainString Deserialize(string jsonString)
{
    return (PlainString)JsonConvert.DeserializeObject<PlainString>(jsonString);
} 

【讨论】:

    【解决方案2】:

    根据我的测试,您似乎只需将您的 PlainString 类设置为公开。

    [JsonObject(MemberSerialization.OptIn)]
    public class PlainString
    {
        [JsonProperty]
        public string Data { get; set; }
        public PlainString() { }
    
        public string ToJsonString()
        {
            return JsonConvert.SerializeObject(this);
        }
        public static PlainString Deserialize(string jsonString)
        {
            return JsonConvert.DeserializeObject<PlainString>(jsonString);
        }
    }
    

    有一个非常模拟。在第 55 行的 TestSocketIOClient.cs 中的示例 - 我也展示了将数据作为 Part 对象获取。

    // cast message as Part - use type cast helper
    Part part = data.Json.GetFirstArgAs<Part>();
    Console.WriteLine(" Part Level:   {0}\r\n", part.Level);
    

    吉姆

    【讨论】:

      猜你喜欢
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多