如何在 Unity 的 websocket 客户端上创建路由之类的东西

问题描述 投票:0回答:1

以前都是用js写的,一切都很简单。我有一个 onmessage 函数,我在其中接收数据,解析它并从中获取路由字段。然后它基本上是一条路线。就是这样。

`const routes = {
  'route_1': () => {},
  'route_2': () => {}
}
...
ws.onmessage = (d) => {
 const data = JSON.Parse(d);
 if(routes[data.route]
   routes[data.route](data.data)
}`

在 JS 中效果很好。但是在 C# 中呢?我可以用同样的方式解析 json。但是我不太明白这一点。在同一个地方,有必要创建一个描述传入数据的类。像这样:

`class Data{
  public string route;
  public string data;
}
ws.onmessage = (d) => {
  var data = JSON.Parse<Data>();
}`

但对我来说,结构上不同的数据会不断出现。为了知道哪些你必须首先解析并查看路由字段。通常是怎么做的?我找不到。

c# unity3d web websocket
1个回答
1
投票

如果问题不是关于统一性的,我会使用 System.Text.Json 解析器。此解析器可以使用部分 json 文档填充

JsonElement
属性,以便稍后可以将其转换为特定的
Type
。一个完整的实现可能看起来像;

public class Message
{
    public string Route { get; set; }
    public JsonElement Data { get; set; }
}

// define an interface, so we can manage multiple handlers without needing to worry about generics
public interface IRoute
{
    void OnMessage(JsonElement data);
}

// define a base type to simplify parsing
public abstract class Route<T>: IRoute
{
    public abstract void OnMessage(T data);

    // convert the data property to a specific type here;
    void IRoute.OnMessage(JsonElement data)
        => data.Deserialize<T>();
}

// then a specific message route handler / data type
public class MyData
{
    public string Property { get; set; }
}

public class MyRoute : Route<MyData>
{
    public override void OnMessage(MyData data)
    {
        // TODO implement handler
    }
}

public class Handler
{
    public static Dictionary<string, IRoute> handlers = new Dictionary<string, IRoute> {
        { "route_1", new MyRoute() }
    };
    public void OnMessage(string json)
    {
        var message = JsonSerializer.Deserialize<Message>(json);
        if (handlers.TryGetValue(message.Route, out var handler))
            handler.OnMessage(message.Data);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.