2013-04-08 3 views
1

Я играл вокруг с импровизированного интерфейсом над jobject и побежал в следующем номереПользовательские impromptuobject для Json.NET десериализации

https://code.google.com/p/impromptu-interface/issues/detail?id=17

вопрос помечается как «не исправит» и в комментариях автор говорит, что это можно было бы исправить, реализовав собственный импровизированный объект.

У кого-нибудь есть образец такой реализации? Или знаете другое решение этой проблемы?

ответ

2

Таким образом, проблема заключается в том, что 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; } 
} 
+0

Спасибо за объяснение, по крайней мере сейчас я знаю, почему так! –

+0

@YvesGoeleven Это пронизано немного больше в затылке, я думаю, что может быть значение, помимо просто импровизированного интерфейса, для исправления этого в json.net, я дам вам знать, если я отправлю патч на json.net для этого. – jbtule

+0

@YvesGoeleven сделал тянуть запрос, посмотрим. https://github.com/JamesNK/Newtonsoft.Json/pull/79 – jbtule

 Смежные вопросы

  • Нет связанных вопросов^_^