elasticsearch,nest,C#,elasticsearch,Nest" /> elasticsearch,nest,C#,elasticsearch,Nest" />

C# 字典的嵌套映射<;字符串,动态>;获取空数组

C# 字典的嵌套映射<;字符串,动态>;获取空数组,c#,elasticsearch,nest,C#,elasticsearch,Nest,当尝试将包含Json的字段从我的数据库反序列化到elasticsearch中的索引时,所有嵌套字段都将获取空数组作为值 { "_index": "dev", "_type": "user", "_id": "072512c2-fc23-471a-9e07-65c3a041f06b", "_score": 1, "_source": { "providerInfos": """{"Global":{"Email":"email@hotmail.c

当尝试将包含Json的字段从我的数据库反序列化到elasticsearch中的索引时,所有嵌套字段都将获取空数组作为值

{
    "_index": "dev",
    "_type": "user",
    "_id": "072512c2-fc23-471a-9e07-65c3a041f06b",
    "_score": 1,
    "_source": {
      "providerInfos": """{"Global":{"Email":"email@hotmail.com","FirstName":"Name","LastName":"Last Name","PostalCode":"XXXXXX","Address":"99 Street","Town":"City","Gender":"M","PhoneNumber":null,"CreatedDate":"2018-04-14T14:34:42.4850547Z","LastLoginDate":"0001-01-01T00:00:00"}}""",
      "providers": {
        "Global": {
          "Email": [],
          "FirstName": [],
          "LastName": [],
          "PostalCode": [],
          "Address": [],
          "Town": [],
          "Gender": [],
          "PhoneNumber": [],
          "CreatedDate": [],
          "LastLoginDate": []
        },
我要反序列化的代码如下所示:

public class User : IdentityUser

  public string JsonInfo { get; protected set; }

    [NotMapped]
    public Dictionary<string, dynamic> Infos
    {
        get => JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(JsonInfo ?? "") ??
               new Dictionary<string, dynamic>();
    }
}
并为其编制索引:

var users = await uow.GetRepository<FedecpIdentityUser, string>().GetAsync();
var indexAllAsync = users
    .Select(u => _elasticSearch.Client.IndexAsync(u, p => p.Id(u.Id.ToString()))).ToList();
var users=await uow.GetRepository().GetAsync();
var indexAllAsync=用户
.Select(u=>_elasticSearch.Client.IndexAsync(u,p=>p.Id(u.Id.ToString()))).ToList();

我注意到这是在我将Nest从5.4更新到6.02之后发生的,是吗?我在变更日志中没有发现任何与此相关的信息。

我怀疑这与Json.NET在6.x中的内部化以及在代码中使用
动态
有关

dynamic
实际上将由Json.NET反序列化为
JToken
类型,而NEST不知道如何序列化,因为出于所有目的和目的,内部化的Json.NET可以被视为一个不了解
Newtonsoft.Json
类型的不同程序集

若要修复此问题,您可以引用和,以便NEST用于文档

var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var connectionSettings =
    new ConnectionSettings(pool, sourceSerializer: JsonNetSerializer.Default);
var client = new ElasticClient(connectionSettings);

我在
dynamic
中遇到了类似的问题,通过进行此更改,问题得到了解决。
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var connectionSettings =
    new ConnectionSettings(pool, sourceSerializer: JsonNetSerializer.Default);
var client = new ElasticClient(connectionSettings);