I don't think there is a magic silver bullet for this issue.
I would suggest validating the incoming JSON data against one of several pre-defined schemas. If it validates against a particular schema, you can safely call JsonConvert.DeserializeObject<T>() against your DTO class.
JSON Schema Validation[
^]
This approach as more performant (it avoids the overhead of raising runtime exceptions)
The other more straight-forward approach would just be to create a 'TryParse' style function, which swallows any exceptions, and call it multiple times, until a valid result is returned ...
public bool TryParseJson<T>(string json, out T value) where T: class, new()
{
value = new T();
bool result = false;
try{
value = JsonConvert.DeserializeObject<T>(json);
result = true;
}catch(Exception)
{
}
return result;
}