Таким образом, проблема заключается в том, что JArray
имеет функцию GetEnumerator(), определенную как интерфейс, что делает метод более не уткам, вызываемым DLR. Итак, ниже я превысил trygetmember
, чтобы проверить, является ли результат JArray
и преобразовать его в JEnumerable
, который реализует GetEnumerator() в вызове dlr invokable способом.
public class NonRecursiveJArrayConversionDictionary : ImpromptuDictionary{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
if(base.TryGetMember(binder, out result)){
if(result is JArray){
result = ((JArray)result).AsJEnumerable();
}
return true;
}
result = null;
return false;
}
}
Однако это будет работать только для json-структур, у которых нет массивов более одного свойства. Вы либо измените приведенное выше, чтобы рекурсивно проверить в любое время что-нибудь, что может быть возвращено, возможно, с прокси-сервером или изменить индексный индекс индексатора set
для проверки и конвертации при десериализации.
Обновление: Json.net Verion> = 5.0.4.16101 и ImpromptuInterface> = 6.1.4 будет работать из коробки.
void Main()
{
ICustomer customer = Impromptu.ActLike(JObject.Parse(@"
{
Id: 1,
Name:'Test',
Location:'Somewhere',
Employees: [
{ Id:1, EmployerId:39421, Name:'Joe' },
{ Id:2, EmployerId:39421, Name:'Jane' },
]
}
"));
foreach(var employee in customer.Employees){
employee.Id.Dump();
employee.Name.Dump();
}
}
public interface ICustomer
{
int Id { get; set; }
string Name { get; set; }
string Location { get; set; }
IList<IEmployee> Employees { get; }
}
public interface IEmployee
{
int Id { get; set; }
int EmployerId { get; set; }
string Name { get; set; }
}
Спасибо за объяснение, по крайней мере сейчас я знаю, почему так! –
@YvesGoeleven Это пронизано немного больше в затылке, я думаю, что может быть значение, помимо просто импровизированного интерфейса, для исправления этого в json.net, я дам вам знать, если я отправлю патч на json.net для этого. – jbtule
@YvesGoeleven сделал тянуть запрос, посмотрим. https://github.com/JamesNK/Newtonsoft.Json/pull/79 – jbtule