我在使用其他不是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 操作上的对象类型,例如。也许将来...