【问题标题】:Custom impromptuobject for json.net deserialization用于 json.net 反序列化的自定义即兴对象
【发布时间】:2013-04-08 07:03:52
【问题描述】:

我在一个作业上玩即兴界面并遇到以下问题

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

该问题被标记为“无法修复”,并且在 cmets 中作者说可以通过实现自定义即兴对象来修复它。

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

【问题讨论】:

    标签: json.net impromptu-interface


    【解决方案1】:

    所以问题在于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 版本 >= 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 提交补丁。
    • @YvesGoeleven 确实提出了拉取请求,我们拭目以待。 github.com/JamesNK/Newtonsoft.Json/pull/79
    猜你喜欢
    • 2022-11-15
    • 2017-03-19
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多