首页 > 解决方案 > 反序列化重大更改 - Elasticsearch 7(Nest 7,Elasticsearch.net)

问题描述

由于在 Elasticsearch 从 ver6.8 升级到 Elasticsearch 7 后 ELlasticsearch 7(nest7、elasticsearch.net)发生了重大变化,我从反序列化中遇到了异常。

通过将 Nest NEST 6 报告给 Elastichsearch 6,我们使用了 JsonConvert.DeserializeObject:

Dictionary<string, List<string>> filteredValuesPerColumnTitles = JsonConvert.DeserializeObject<Dictionary<string, List<string>>>(plotlyTraceData.FilteredValuesPerColumns);

或这些行:

CreateMap<TraceData, TraceResource>().ForMember(r => r.TraceJsonData, opt => opt.MapFrom(d => JsonConvert.DeserializeObject<Dictionary<string, object>>(d.TraceJsonData)));

public class TraceData
{
   public string DataSessionNumber { get; set; }

   public string FilteredValuesPerColumns { get; set; }

   public string TraceJsonData { get; set; }
}

public class TraceResource : BaseResource  
{     

   public string FilteredValuesPerColumns { get; set; }

   public string TraceJsonData { get; set; }

 public Dictionary<string, object> TraceJsonData { get; set; }

}

升级到 Elasticsearch 7、nest7 和 elasticsearch.net 后,我​​尝试根据新格式更改反序列化:

 Dictionary<string, List<string>> filteredValuesPerColumnTitles = new Dictionary<string, List<string>>();
 JsonNetSerializer jsonNetSerializer = new JsonNetSerializer(traceRepository.SourceSerializer, traceRepository.ConnectionSettings);
 
byte[] bytes = Encoding.UTF8.GetBytes(plotlyTraceData.FilteredValuesPerColumns);
using (MemoryStream memoryStream = new MemoryStream(bytes))
{
   filteredValuesPerColumnTitles = jsonNetSerializer.Deserialize<Dictionary<string, List<string>>> 
   (memoryStream);
}

但是我遇到了下一个异常,嵌套 6 或嵌套 7 试图向 ElasticSearch7 报告:

{Newtonsoft.Json.JsonReaderException:解析值时遇到意外字符:S.路径'',第0行,位置0。在Newtonsoft.Json.JsonTextReader.ParseValue()在Newtonsoft.Json.JsonReader.ReadForType(JsonContract合同,布尔hasConverter ) 在 Newtonsoft.Json.Json.Serializer.DeserializeInternal(JsonReader reader, Type objectType) 在 Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type) , JsonSerializerSettings 设置)在 Newtonsoft.Json.JsonConvert.DeserializeObject[T](字符串值,JsonSerializerSettings 设置)在 Controllers.OutputController.d__4.MoveNext() 在 C:\Projects\Controllers\OutputController.cs:line 99}

客户端初始化:

    var uri = new UriBuilder("http", ElasticHandlerSettings.Value.ElasticUri, 
        Convert.ToInt32(ElasticHandlerSettings.Value.ElasticPort)).Uri;

    // Set Default Mapping for GET methods //
    var settings = new ConnectionSettings(uri)
        .DefaultMappingFor<AutomationLogData>(m => m
        .IndexName($"{IndexPrefix.LOG_INDEX_PREFIX}-*"))
        //.TypeName(nameof(AutomationLogData)))
        .DefaultMappingFor<AutomationLayoutData>(m => m
        .IndexName($"{IndexPrefix.LAYOUT_INDEX_PREFIX}-*"))
        //.TypeName(nameof(AutomationLayoutData)))
        .DefaultMappingFor<TraceData>(m => m
        .IndexName($"{IndexPrefix.TRACE_INDEX_PREFIX}-*"));
        //.TypeName(nameof(TraceData)));

    Client = new ElasticClient(settings);

请告知如何修复它。

标签: jsonelasticsearchdeserializationnestelasticsearch.net

解决方案


推荐阅读