由于在 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);
请告知如何修复它。