从JSON确定对象类型

时间:2017-01-13 22:07:00

标签: c# json.net deserialization

我有一个给我一个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的某个地方,我只是忽略或不理解。它可能比我的解决方案更好,更快......

1 个答案:

答案 0 :(得分:2)

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

我采取的步骤:

  1. 向我公开的_schema字段的消息对象添加了一个Schema属性。第一次调用该属性时,它会使用JsonSchemaGenerator.Generate(object o)的返回值填充_schema。
  2. 通过JObject.Parse()静态方法将JSON字符串转换为JObject。
  3. Newtonsoft.Json.Schema.Extensions中有一个扩展方法,可以将JObject与JsonSchema进行比较并确定它们是否匹配。
  4. 请注意:上述方法已移至单独的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))
    {...}
    ...