简体   繁体   English

Newtonsoft.Json.JsonSerializationException:无法创建类型的实例(抽象类)

[英]Newtonsoft.Json.JsonSerializationException : Could not create an instance of type (abstract class)

I am trying to test Serialisation for the below example but i ended up getting this error Newtonsoft.Json.JsonSerializationException : Could not create an instance of type Core.Model.Assets.Asset. Type is an interface or abstract class and cannot be instantiated. Path '_source.articleAssets[0].asset.refId' 我试图测试下面的示例序列化,但我最终得到此错误Newtonsoft.Json.JsonSerializationException : Could not create an instance of type Core.Model.Assets.Asset. Type is an interface or abstract class and cannot be instantiated. Path '_source.articleAssets[0].asset.refId' Newtonsoft.Json.JsonSerializationException : Could not create an instance of type Core.Model.Assets.Asset. Type is an interface or abstract class and cannot be instantiated. Path '_source.articleAssets[0].asset.refId' Newtonsoft.Json.JsonSerializationException : Could not create an instance of type Core.Model.Assets.Asset. Type is an interface or abstract class and cannot be instantiated. Path '_source.articleAssets[0].asset.refId' . Newtonsoft.Json.JsonSerializationException : Could not create an instance of type Core.Model.Assets.Asset. Type is an interface or abstract class and cannot be instantiated. Path '_source.articleAssets[0].asset.refId' In below example, Asset is a abstract class and there are more than 5 derived classes ( eg: BrightcoveVideo is one of the derived class) 在下面的示例中, Asset是一个抽象类,并且有超过5个派生类(例如: BrightcoveVideo是派生类之一)

ArticleAssets = new List<ArticleAsset>()
{
    new ArticleAsset()
    {
        ArticleId = 1, 
        Asset = new BrightcoveVideo()
        {
            AssetType = AssetTypeEnum.BrightcoveTitle, Id = 11, Name = "something for a name", DisplayName = "some display", RefId = "refrefref"
        },
        AssetId = 11,
        AssetType = AssetTypeEnum.BrightcoveTitle
    }
}

I have a custom JsonConverter class which looks like this : 我有一个自定义的JsonConverter类,如下所示:

public class AssetTypeConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Asset) || objectType == typeof(SearchResultAsset);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value != null && value.GetType() == typeof(SearchResultAsset))
        {
            throw new NotImplementedException("WriteJson unexpectedly called for SearchResultAsset in AssetTypeConverter");
        }

        throw new NotImplementedException("WriteJson unexpectedly called for Asset in AssetTypeConverter");
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
        {
            return null;
        }

        Asset concreteAsset = new SearchResultAsset();
        serializer.Populate(reader, concreteAsset);

        return concreteAsset;
    }
}

In ElasticSearchRegistry class,i am adding this converter in the following way : 在ElasticSearchRegistry类中,我将按以下方式添加此转换器:

var connectionSettings = new ConnectionSettings(connectionUri);
_elasticClient = new ElasticClient(connectionSettings);
connectionSettings.SetJsonSerializerSettingsModifier(p => p.Converters.Add(new AssetTypeConverter()));

I get that JsonSerialization exception at following Get request : 我在以下Get请求中得到了JsonSerialization异常:

public IGetResponse<Article> GetArticleResponse(int id)
{
    var response = _elasticClient.Get<Article>(i => i.Index(_indexName)
            .Type(DocumentType)
            .Id(id)
        );

    return response;
}

I got it fixed, It was very small mistake. 我把它修好了,这是一个非常小的错误。 I have set JsonSerializerSettings before instantiating ElasticClient like this : 我在实例化ElasticClient之前设置了JsonSerializerSettings ,如下所示:

connectionSettings = new ConnectionSettings(connectionUri);
connectionSettings.SetJsonSerializerSettingsMo‌​difier(
    p => p.Converters.Add(new AssetTypeConverter())
);
_elasticClient = new ElasticClient(connectionSettings);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Newtonsoft.Json.JsonSerializationException - Newtonsoft.Json.JsonSerializationException 错误:Newtonsoft.Json.JsonSerializationException - Error: Newtonsoft.Json.JsonSerializationException Xamarin Newtonsoft.Json.JsonSerializationException: - Xamarin Newtonsoft.Json.JsonSerializationException: 用户代码未处理Newtonsoft.Json.JsonSerializationException - Newtonsoft.Json.JsonSerializationException was unhandled by user code Twitterizer TwittterTimeline NewtonSoft.JSON.JsonSerializationException问题 - Twitterizer TwittterTimeline NewtonSoft.JSON.JsonSerializationException problems 如何处理Newtonsoft.Json.JsonSerializationException? - How to handle Newtonsoft.Json.JsonSerializationException? Newtonsoft.Json.JsonSerializationException: C# - Newtonsoft.Json.JsonSerializationException: C# 反序列化类时“Newtonsoft.Json.JsonSerializationException无法找到用于类型的构造函数”错误 - “Newtonsoft.Json.JsonSerializationException unable to find constructor to use for types” error when deserializing class ModelState错误-Newtonsoft.Json.JsonSerializationException:无法填充列表类型System.Net.TrackingStringDictionary - ModelState error - Newtonsoft.Json.JsonSerializationException: Cannot populate list type System.Net.TrackingStringDictionary MVC/WebApi:“Newtonsoft.Json.JsonSerializationException”类型的异常 - 从发布请求中检索数组时 - MVC/WebApi: Exception of type 'Newtonsoft.Json.JsonSerializationException' - When retrieving array from post request
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM