NEST-отображение словаря <string, dynamic>, получающего пустые массивы - PullRequest
0 голосов
/ 28 июня 2018

При попытке десериализации поля, содержащего Json, из моей базы данных для индексации вasticsearch, все вложенные поля получают пустой массив в качестве значения.

{
    "_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>();
    }
}

В поле JsonInfo в моей базе данных у меня есть, например:

{"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"}}

И индексировать все это:

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

Я заметил, что это происходит после того, как я обновил Nest с 5.4 до 6.02, может ли это быть? Я не нашел ничего об этом в журналах изменений.

1 Ответ

0 голосов
/ 29 июня 2018

Я подозреваю, что это связано с интернализацией Json.NET в 6.x и использованием dynamic в вашем коде.

dynamic будет фактически десериализовано до JToken типов с помощью Json.NET, который NEST не будет знать, как сериализовать, поскольку интернализованный Json.NET для всех намерений и целей можно рассматривать как другую сборку, которая ничего не знает о Newtonsoft.Json типов.

Чтобы исправить, вы можете сослаться на Nest.JsonNetSerializer пакет nuget и , подключить JsonNetSerializer в качестве сериализатора для использования NEST для ваших документов

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