I don't know if there's a way to do that with JSON.NET. Maybe you're overthinking it. How about creating a separate DTO type for deserializing the JSON, then projecting the result into another type suited more to your domain. For example:
public class MyRootDTO
{
public Dictionary<String, MyChildDTO> Devices { get; set; }
}
public class MyChildDTO
{
[JsonProperty("Name")]
public String Name { get; set; }
[JsonProperty("Type")]
public String Type { get; set; }
}
public class MyRoot
{
public String Key { get; set; }
public String Name { get; set; }
public String Type { get; set; }
}
Then you can map it as follows:
public IEnumerable<MyRoot> MapMyRootDTO(MyRootDTO root)
{
return root.Devices.Select(r => new MyRoot
{
Key = r.Key,
Name = r.Value.Name
Type = r.Value.Type
});
}