以前都是用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>();
}`
但对我来说,结构上不同的数据会不断出现。为了知道哪些你必须首先解析并查看路由字段。通常是怎么做的?我找不到。
如果问题不是关于统一性的,我会使用 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);
}
}