4

我在使用其他不是Newtownsoft.Json的 json 库(反)序列化DynamicObject时遇到问题。(Jil、NetJSON、ServiceStack.Text...)

这是我的可扩展对象类:

public class ExpandableObject : DynamicObject
{
    private readonly Dictionary<string, object> _fields = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
    [JsonIgnore]
    public Dictionary<string, object> Extra { get { return _fields; } }
    
    public override IEnumerable<string> GetDynamicMemberNames()
    {
        var membersNames = GetType().GetProperties().Where(propInfo => propInfo.CustomAttributes
            .All(ca => ca.AttributeType != typeof (JsonIgnoreAttribute)))
            .Select(propInfo => propInfo.Name);
        return Extra.Keys.Union(membersNames);
    }
    
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        return _fields.TryGetValue(binder.Name, out result);
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        _fields[binder.Name] = value;
        return true;
    }
}

其他库(如 Jil)的问题是未调用覆盖的方法。 使用 Newtonsoft.Json 效果很好,但性能很差。

例如 - 派生类的反序列化测试:

public class Person : ExpandableObject
{
    public int Id { get; set; }
}

public class Program
{
    public static void Main(string[] args)
    {
        var json = "{ \"Id\": 12 , \"SomeFiled\" : \"hello\" }";
        var person = Jil.JSON.Deserialize<Person>(json);            
    }
}

也不例外..它只是忽略了“SomeFiled”字段(应该在“Extra”中)

1.有什么解决办法吗?

2.为什么Newtonsoft.Json能执行操作而JIL不能?(或其他快速库......)。我知道DLR应该调用被覆盖的方法。我怎样才能让它工作?

谢谢。

编辑:

现在我使用DeserilizeDynamic而不是 Deserialize(T)。现在它可以工作了,我的方法由 DLR 调用。目前唯一的问题是 DeserilizeDynamic 返回“动态”并且没有通用覆盖 (T)。并且由于该 Web API 无法解析 POST 操作上的对象类型,例如。也许将来...

4

1 回答 1

1

如果您查看 wiki ( https://github.com/kevin-montrose/Jil/wiki/Common-Pitfalls ) 中的 Common Pitfalls 文档,您将看到以下内容:

如果你有一个类 FooBase 和一个类 Bar : FooBase 和一个像 JSON.Serialize(myBar) 这样的调用,Jil 默认不会序列化从 FooBase 继承的成员。请注意,在许多情况下,可以推断出通用参数。

要解决此问题,请传递一个将 ShouldIncludeInherited 设置为 true 的 Options 对象。

于 2015-09-15T08:21:12.037 回答