我有一个事件给了我一个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 来检测对象类型。
我采取的步骤:
- 向我的消息对象添加了 Schema 属性,该属性公开了_schema字段。第一次调用该属性时,它会使用 JsonSchemaGenerator.Generate(object o) 的返回值填充_schema。
- 通过 JObject.Parse() 静态方法将 JSON 字符串转换为 JObject 。
- 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))
{...}
...