为什么Json Dot Net甚至没有尝试评估我的界面属性?

时间:2015-08-20 17:51:24

标签: c# json.net

我有一个对象,我试图拦截两个属性接口的反序列化过程。我正在使用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;

1 个答案:

答案 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();
    }
}