如何使用 ServiceStack 将 json 反序列化为多个 DataContracts 之一

How to Deserialize json to one of several DataContracts with ServiceStack

我已连接到 websocket 并订阅了 MessageRecieved 事件。在那种情况下,我将得到一个字符串 (json),它可以被反序列化为大约 5 个不同的 DataContracts 中的任何一个。现在我只是使用带有 txt 的唯一位的 switch 语句,然后调用 var item = message.FromJson<MyType1>();

是否有更好的动态方式来做到这一点?

如果你想将 JSON 反序列化为一个类型,那么你需要告诉 ServiceStack 序列化程序它应该反序列化为什么类型,如果你愿意,你可以反序列化为运行时类型:

Type intoType = GetTypeToDeserializeInto(msg);
var dto = JsonSerializer.DeserializeFromString(msg, intoType);

使用 JS 实用程序

或者,如果您只需要一般地访问 JSON 数据而不需要反序列化为类型,您可以使用 JSON Utils,例如:

var obj = (Dictionary<string, object>) JSON.parse(msg);
var prop1 = obj["prop1"];

将对象字典转换为类型

如果JSON是一个平面结构你可以稍后使用ServiceStack的Reflection Utils将对象字典转换成一个类型,例如:

var dto = obj.FromObjectDictionary<MyType1>();

var dto = map.FromObjectDictionary(intoType); // runtime Type

在 JSON

中嵌入类型信息

如果所有消息类型都派生自同一个子类,则还可以嵌入 JSON 应该反序列化的类型,如果它在第一个“__type”中嵌入完整类型名称 属性,例如:

// json starts with: {"__type": "Namespace.MyType1", ...}
var dto = msg.FromJson<Message>(json);

但您需要考虑对 auto deserialization of Late-bound Object Types 施加的限制。