用于json.net反序列化的自定义改进对象



我在一个jobject上玩即兴界面,遇到了以下问题

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

该问题被标记为"不会修复",作者在评论中表示,可以通过实现自定义即兴对象来修复该问题。

有人有这样一个实现的例子吗?或者知道这个问题的另一个解决方案吗?

所以问题是JArray只将GetEnumerator((定义为接口,这使得DLR不再可以调用该方法。因此,下面我覆盖了trygetmember,以检查结果是否是JArray的,并将其转换为以可调用dlr的方式实现GetEnumerator((的JEnumerable

 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.4.16101和ImpromptuInterface>=6.4.1将开箱即用。

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; }
}

相关内容

  • 没有找到相关文章

最新更新