【问题标题】:Retrieve Dynamic class name from JSON.NET?从 JSON.NET 检索动态类名?
【发布时间】:2015-03-16 16:32:18
【问题描述】:

我正在使用 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 属性找出类名,然后在检查该属性后继续填充类。

感谢您的帮助!

【问题讨论】:

  • 可以使用dynamic关键字反序列化为动态对象,然后遍历属性得到MessageName

标签: c# .net json serialization json.net


【解决方案1】:

JSON 只能反序列化为众所周知的类。您需要指定数据布局(即类/类型)

有两种选择:

1.) 更深一层。使用 JSON 令牌解析器从您的 JSON 流中读取令牌并根据您找到的令牌采取行动。

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

【讨论】:

  • 谢谢,我最终使用阅读器读取 MessageName 令牌,然后使用反射获取类型,最后使用 JSONConverter 填充对象。比我真正想做的工作多一点,但它至少可以工作,而无需求助于一些疯狂的双编码传输格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多