从 JSON 确定对象类型



我有一个事件给了我一个JSON字符串:

...
public delegate void DataReceivedHandler(string jsonString);
...
public event DataReceivedHandler OnDataReceived = null;
...
if(OnDataReceived != null)
{
    OnDataReceived(jsonString);
}
...

该 JSON 字符串可以是 3 个不同的复杂对象之一:LogOnMessage、LogOffMessage 或 DataRequest。每条消息都有一组唯一的字段和属性。

如何确定 JSON 字符串解析为哪种对象类型?

我知道我可以编写一种方法来迭代 JObject 的 JProperty.Name 并通过迭代我的对象集合及其元数据来找到匹配项,但我的直觉告诉我这是一个需要解决的常见挑战,因此它必须内置到 Newtonsoft JSON .NET 中我只是忽略或不理解的地方。它可能比我的解决方案更好、更快......

我终于能够使用 JObjects 和 JsonSchema 来检测对象类型。

我采取的步骤:

  1. 向我的消息对象添加了 Schema 属性,该属性公开了_schema字段。第一次调用该属性时,它会使用 JsonSchemaGenerator.Generate(object o) 的返回值填充_schema。
  2. 通过 JObject.Parse() 静态方法将 JSON 字符串转换为 JObject
  3. Newtonsoft.Json.Schema.Extensions 中有一个扩展方法,可以将 JObject 与 JsonSchema 进行比较,并确定它们是否匹配。

请注意:上述方法已移至单独的Newtonsoft.Schema库。所以我的建议是利用最新和最好的库。

private Newtonsoft.Json.Schema.JsonSchema _schema;  
public static Newtonsoft.Json.Schema.JsonSchema Schema
{
    get
    {
        if (_schema == null)
        {
            Newtonsoft.Json.Schema.JsonSchemaGenerator generator = new Newtonsoft.Json.Schema.JsonSchemaGenerator();
            _schema = generator.Generate(typeof(DataResponse));
        }
        return _schema;
    }
}
...
Newtonsoft.Json.Linq.JObject message = Newtonsoft.Json.Linq.JObject.Parse(json); 
if(Newtonsoft.Json.Schema.Extensions.IsValid(message, DataResponse.Schema))
{...}
else if (Newtonsoft.Json.Schema.Extensions.IsValid(message, ServerStatus.Schema))
{...}
...

相关内容

  • 没有找到相关文章

最新更新