【发布时间】:2018-04-19 08:21:37
【问题描述】:
我有一个派生自 DynamicObject 的类 EntityBase,没有空的默认构造函数。
// this is not the actual type but a mock to test the behavior with
public class EntityBase : DynamicObject
{
public string EntityName { get; private set; }
private readonly Dictionary<string, object> values = new Dictionary<string, object>();
public EntityBase(string entityName)
{
this.EntityName = entityName;
}
public virtual object this[string fieldname]
{
get
{
if (this.values.ContainsKey(fieldname))
return this.values[fieldname];
return null;
}
set
{
if (this.values.ContainsKey(fieldname))
this.values[fieldname] = value;
else
this.values.Add(fieldname, value);
}
}
public override IEnumerable<string> GetDynamicMemberNames()
{
return this.values.Keys.ToList();
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = this[binder.Name];
return true;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
this[binder.Name] = value;
return true;
}
}
我想反序列化的 JSON 如下所示:
{'Name': 'my first story', 'ToldByUserId': 255 }
EntityBase 既没有 Name 也没有 ToldByUserId 属性。它们应该被添加到 DynamicObject。
如果我让DeserializeObject 像这样创建对象,一切都会按预期工作:
var story = JsonConvert.DeserializeObject<EntityBase>(JSON);
但由于我没有空的默认构造函数并且无法更改类,所以我选择了CustomCreationConverter:
public class StoryCreator : CustomCreationConverter<EntityBase>
{
public override EntityBase Create(Type objectType)
{
return new EntityBase("Story");
}
}
但是
var stroy = JsonConvert.DeserializeObject<EntityBase>(JSON, new StoryCreator());
抛出
无法将 JSON 对象填充到类型“DynamicObjectJson.EntityBase”。 路径“名称”,第 1 行,位置 8。
似乎DeserializeObject 在CustomCreationConverter 创建的对象上调用PopulateObject。当我尝试手动执行此操作时,错误保持不变
JsonConvert.PopulateObject(JSON, new EntityBase("Story"));
我进一步假设PopulateObject 不会检查目标类型是否源自DynamicObject,因此不会退回到TrySetMember。
请注意,我对EntityBase 类型定义没有影响,它来自外部库,无法更改。
任何见解都将受到高度赞赏!
编辑:添加示例:https://dotnetfiddle.net/EGOCFU
【问题讨论】:
-
您是否愿意创建一个无参数构造函数(可能是私有的并用
[JsonCOnstructor]标记)并将EntityName标记为[JsonProperty]或[DataMember],如C# How to serialize (JSON, XML) normal properties on a class that inherits from DynamicObject 所示?我相信这应该可行。 -
遗憾的是我对类型定义没有影响,它是一个外部库
-
EntityName是否有您要反序列化的真实类型的私有 setter?
标签: c# json.net dynamicobject