Это потому, что десериализатор не знает, как обрабатывать подобъект. Что у вас есть в JS это:
var x = {
'property1' : 'string',
'property2' : 'string',
'property3' : { p1: 'string', p2: 'string', p3: 'string' },
};
, у которого нет карты с чем-то действительным в C #:
HashTable h = new HashTable();
h.Add("property1", "string");
h.Add("property2", "string");
h.Add("property3", ???);
??? потому что здесь не определен тип, так как десериализатор узнает, что представляет собой анонимный объект в вашем JS?
Редактировать
Нет способа сделать то, что вы пытаетесь достичь здесь. Вам нужно будет напечатать свой объект. Например, определение вашего класса следующим образом:
class Foo{
string property1 { get; set; }
string property2 { get; set; }
Bar property3 { get; set; } // "Bar" would describe your sub-object
}
class Bar{
string p1 { get; set; }
string p2 { get; set; }
string p3 { get; set; }
}
... или что-то в этом роде.