我有一个问题是(de)序列化 DynamicObject 和其他不 Newtownsoft.Json的json库。 (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返回'dynamic'并且没有泛型覆盖(T)。并且因为Web API无法在POST操作上解析对象的类型,例如。 未来的mabye ......
答案 0 :(得分:0)
如果您查看维基(https://github.com/kevin-montrose/Jil/wiki/Common-Pitfalls)中的Common Trafalls文档,您将看到以下内容:
如果你有一个类FooBase和一个类Bar:FooBase和一个类似的调用 JSON.Serialize(myBar),Jil不会序列化继承的成员 来自FooBase默认情况下。请注意,在许多情况下通用 参数可以推断出来。
要解决此问题,请将ShouldIncludeInherited设置为的Options对象传递给 真。