Elasticsearch.NET (NEST) не удается десериализовать мой POCO JSON в версии 7.x - PullRequest
0 голосов
/ 18 октября 2019

Elasticsearch 7.x для .NET имеет документированное критическое изменение с помощью внутреннего сериализатора JSON Utf8 .

Вместо меня используется другая опция -> сериализатор Json.NET от Newtonsoft, яЯ пытаюсь выяснить, какая часть моего JSON нарушает работу сериализатора.

  • Клиентский nuget: 7.3.1
  • Сервер: 7.2.0

Во-первых, ошибка чувствует , как будто это полезно, но я не думаю, что это действительно так:

2019-10-18 17:15:33 ERR Fatal error.
Elasticsearch.Net.UnexpectedElasticsearchClientException: expected:'String Begin Token', actual:'2', at offset:540 ---> Elasticsearch.Net.Utf8Json.JsonParsingException: expected:'String Begin Token', actual:'2', at offset:540
   at Elasticsearch.Net.Utf8Json.JsonReader.ReadStringSegmentCore(Byte[]& resultBytes, Int32& resultOffset, Int32& resultLength)
   at Elasticsearch.Net.Utf8Json.JsonReader.ReadString()
   at Deserialize(Object[] , JsonReader& , IJsonFormatterResolver )
   at Elasticsearch.Net.Utf8Json.JsonSerializer.Deserialize[T](Byte[] bytes, Int32 offset, IJsonFormatterResolver resolver)
   at Elasticsearch.Net.Utf8Json.JsonSerializer.Deserialize[T](Stream stream, IJsonFormatterResolver resolver)
   at Elasticsearch.Net.DiagnosticsSerializerProxy.Deserialize[T](Stream stream)
   at Nest.SourceFormatter`1.Deserialize(JsonReader& reader, IJsonFormatterResolver formatterResolver)
   at Deserialize(Object[] , JsonReader& , IJsonFormatterResolver )
   at Nest.ReadAsFormatter`2.Deserialize(JsonReader& reader, IJsonFormatterResolver formatterResolver)
   at Elasticsearch.Net.Utf8Json.Formatters.CollectionFormatterBase`4.Deserialize(JsonReader& reader, IJsonFormatterResolver formatterResolver)
   at Deserialize(Object[] , JsonReader& , IJsonFormatterResolver )
   at Nest.ReadAsFormatter`2.Deserialize(JsonReader& reader, IJsonFormatterResolver formatterResolver)

... etc ...

Так что у персонажа 540 что-то плохое.

Так что я думаю У меня есть JSON, который вернулся. Я думаю , потому что я попросил коллегу использовать Fiddler и дать мне результат полезной нагрузки. Я не могу вставить всю полезную нагрузку в любом месте, потому что она содержит конфиденциальные данные, но это часть кода в строке 540

enter image description here

Там нет '2'там.

Так что насчет Json? Вот хорошо отформатированный снимок экрана json со скрытыми пользовательскими результатами:

enter image description here

и, наконец, раздел poco для раздела Iдумаю, что ошибается (но я не уверен):

        [Keyword(Index = false)]
        public string Street { get; set; }

        [Keyword]
        public string Suburb { get; set; }

        [Keyword]
        public string State { get; set; }

        [Keyword]
        public string StateCode { get; set; }

        [Keyword]
        public string Country { get; set; }

        [Keyword]
        public string Postcode { get; set; }

        [GeoPoint]
        public GeoLocation LatLong { get; set; }

Итак:

  • Я не уверен, как получить точный json, который анализируетсяГНЕЗДО. Это json, который я взял, что может быть подтверждено предоставленным фрагментом?
  • Есть ли способ, которым я могу вручную создать модульный тест + использовать внутренний сериализатор Utf8 с NEST для загрузки моего json, если я сохраню этоПолезная нагрузка JSON в файл для дальнейшей отладки?

1 Ответ

0 голосов
/ 21 октября 2019

Проблема с перечислениями. Out ES DB имеет небольшое подмножество документов со значением number/int, в то время как у нашего POCO значение string. Строковое значение - это строковое представление наших перечислений, в то время как значение int было предыдущим представлением перечислений для int.

public class Foo
{
    public string statusType { get; set }
}

Чтобы выяснить, что это за ошибка, я должен был сделать следующее:

  • Клонируйте репозиторий ES и установите точку останова в методе ES * JsonSerializer Deserialize<T>, поскольку SourceLink не включен в пакетах nuget ES (на момент публикации).
  • Обновите метод для преобразования байтового массива в строку, чтобы я мог видеть, какова полезная нагрузка JSON, прежде чем он попытается десериализоваться в наш POCO.
  • Шаг через код,чтобы наконец достичь точки останова и посмотреть, какова полезная нагрузка json.

Итак, сообщение об ошибке относится к сегменту json моего документа. Не вся json ES полезная нагрузка. В приведенном выше примере у меня есть 5 «хитов» (сегментов документа), поэтому Deserialize получало 1 хит за сегмент документа. Когда он попадает в сегмент со значениями int (которые должны были быть равными string), он затем падает. Так что теперь я вижу, что ошибка в char 540 и альт ....

  "statusType": 2,

, что плохо. должно быть:

  "statusType": "available",

Итак - проблема выявлена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...