我有一个对象,我试图拦截两个属性接口的反序列化过程。我正在使用Json Dot Net。
我面临的问题是Json Dot Net甚至没有尝试转换两个IDataStore属性。换句话说,' CanConvert'从来没有为这些类型运行。
我尝试过添加JsonProperty和JsonConverter属性但仍然没有骰子。
任何见解都将受到赞赏。
编辑(和答案) 在被Ron Beyer要求发布JSON之后,很明显Json Dot Net甚至不考虑在属性上运行JSON没有它。添加'" SourceDataStore":{}'它试图转换该属性。我当时认为它会查看当前的对象类型并对其进行迭代,但事实上显然是一个匹配的过程
JSON
{
"Name":"My First Definition",
"SourceDataStoreType":"SqlDataStore",
"DestinationDataStoreType":"MongoDataStore"
}
类
internal class Definition
{
public string Name { get; set; }
public DataStoreTypes SourceDataStoreType { get; set; }
public DataStoreTypes DestinationDataStoreType { get; set; }
public IDataStore SourceDataStore { get; set; }
public IDataStore DestinationDataStore { get; set; }
public Definition()
{
}
}
转换器
public class DataStoreConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
var b = objectType == typeof(IDataStore);
return b;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return new SqlDataStore();
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
代码
var definition = JsonConvert.DeserializeObject<Definition>(definitionsJson, new JsonSerializerSettings
{
Converters = new[] { new DataStoreConverter() }
});
return definition;
答案 0 :(得分:0)
(回答评论)
我要求JSON示例验证1)JSON格式正确,并且2)包含了相关属性。
事实证明,问题是,JSON反序列化器不会尝试在JSON中找不到的任何属性上运行转换。这是因为反序列化器解析JSON并在对象中查找要填写的适当属性。如果JSON中不存在该属性,则它不会尝试从无内容构建该属性。
有两种解决方案,要么你可以为JSON中的那些添加一个null(空白)属性,要么你可以在运行构造函数时编辑你的对象来创建它们,如:
internal class Definition
{
public string Name { get; set; }
public DataStoreTypes SourceDataStoreType { get; set; }
public DataStoreTypes DestinationDataStoreType { get; set; }
public IDataStore SourceDataStore { get; set; }
public IDataStore DestinationDataStore { get; set; }
public Definition()
{
var container = YourIOCContainerHere.Instance;
SourceDataStore = container.Resolve<IDataStore>();
DestinationDataStore = container.Resolve<IDataStore>();
//Or, without using IOC/DI
SourceDataStore = new SqlDataStore();
DestinationDataStore = new SqlDataStore();
}
}