C# 从JSON.NET检索动态类名?

C# 从JSON.NET检索动态类名?,c#,.net,json,serialization,json.net,C#,.net,Json,Serialization,Json.net,我正在使用JSON.NET通过网络接收消息。消息格式有些动态,因为消息将由许多不同的类表示,每个类都继承自父消息。例如: { MessageName: "MessageType1", Data1: 124, Data2: "Something" } { MessageName: "MessageType2", OtherData: "Some data", MoreData: "Even more", ANumber: 25 } 我遇

我正在使用JSON.NET通过网络接收消息。消息格式有些动态,因为消息将由许多不同的类表示,每个类都继承自父消息。例如:

{
    MessageName: "MessageType1",
    Data1: 124,
    Data2: "Something"
}


{
    MessageName: "MessageType2",
    OtherData: "Some data",
    MoreData: "Even more",
    ANumber: 25
}
我遇到的问题是,在JSON.NET中,我不知道如何计算类的名称(MessageType1/MessageType2/etc),以便将其反序列化到类的实例中,而无需反序列化两次。我考虑过几个选择;我目前使用的是一个容器类,其中包含消息名和序列化为字符串的实际json消息,但这似乎是浪费

我考虑过的另一种方法是反序列化到一个字符串/字符串字典中,然后自己执行类的填充,考虑到JSON.NET可以为我做到这一点,这似乎是混乱和不必要的。。。只要我先知道这门课

我真的希望有一种简单的方法让JSON.NET通过检查MessageName属性来找出类名,然后在检查该属性后继续填充类


谢谢你的帮助

JSON只能反序列化到已知的类中。您需要指定数据布局(即类/类型)

有两种选择:

1)更深一层。使用JSON令牌解析器从JSON流中读取令牌,并根据找到的令牌进行操作


2.)正如您所建议的:使用足够灵活的类布局来容纳所有可能的变体,如键/值字典。

您可以使用dynamic关键字反序列化为动态对象,然后遍历属性以获得
MessageName
。谢谢,我最后使用了一个阅读器来读取MessageName令牌,然后使用反射获取类型,最后使用JSONConverter填充对象。比我真正想做的工作要多一些,但它至少可以工作,而不必求助于一些疯狂的双重编码传输格式。