.NET Core 3.0 WebApi (JsonSerialize) не сериализует вложенные объекты / всю информацию об объектах - PullRequest
1 голос
/ 27 сентября 2019

У меня есть список объектов как IEnumerable<IHit<Header>>, но .NET Core 3.0 не выдает всю информацию

это когда я возвращаю один объект IHit из списка obj.ElementAt(0)

{"объяснение": нуль, "поля": ноль, "выделение": {}, "id": "123", "индекс": "ky", "innerHits": {}, "matchedQueries": [], "nested": null, "primaryTerm": null, "routing": null, "Score": 10.98915, sequenceNumber: null, "sorts": [], "source": {"timeStamp":"2019-05-16T06: 16: 07Z", "result": "PASS", "testTimeStart": "20190516141559", "testTimeEnd": "20190516141607", "barcode": "XXRX8762"}, "type": "_doc "," version ": 0}

но когда я возвращаю сам список:

[{" объяснение ": ноль," поля ": ноль,"выделите ": {}," innerHits ": {}," matchedQueries ": []," nested ": null," score ": 10.98915," sorts ": []}]

такжекогда я пытаюсь явно вызвать JsonSerializer

string s = JsonSerializer.Serialize(result, typeof(IEnumerable<IHit<Header>>), obj);

Подвести итог:

  1. WebApi работает правильнои возвращение объекта, сериализованного правильно, если sигнорировать объект:

    public IHit<Header> Get(string id)

, но если список , то это не так.

public IEnumerable<IHit<Header>> GetAll()

Я пытался IEnumerable, IList, List и все тот же результат!

JsonSerializer не работает ни с одним объектом, ни со списком

Ответы [ 3 ]

0 голосов
/ 27 сентября 2019

Если вы используете Newtonsoft.Json, выполните следующие действия:

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddMvc()
        .AddJsonOptions(
            options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        );

    ...
}

Если вы не используете Newtonsoft.Json, выполните следующие действия:

public void ConfigureServices(IServiceCollection services)
{
    ...

   services.AddMvc().AddJsonOptions(option => option.JsonSerializerOptions.MaxDepth = 2);

    ...
}

Для получения более подробной информации: Связанные данные и сериализация

0 голосов
/ 27 сентября 2019

Я до сих пор не знаю странного поведения, с которым я столкнулся из-за испускания одного объекта, а не случая со списком.

, но здесь, как решить проблему, основываясь на ответе @ poke и @ NeilMacMullen'sкомментарий

  1. добавить пакет Microsoft.AspNetCore.Mvc.NewtonsoftJson
  2. в Startup.cs, добавить

    services.AddControllers().AddNewtonsoftJson();

0 голосов
/ 27 сентября 2019

JsonSerializer скорее всего не знает, как сериализовать IHit<T>.Я бы предложил один из следующих вариантов:

Получение ответа JSON string от Elasticsearch с использованием либо

  1. клиента низкого уровня, представленного на клиенте высокого уровня в качестве свойства .LowLevel,Вы можете сериализовать высокоуровневый тип запроса, используя PostData.Serializable(request)
  2. , используя OnRequestCompleted() и задав DisableDirectStreaming() по запросу или глобально ConnectionSettings

или

Отображение ответа от Elasticsearch на другой тип, который JsonSerializer будет сериализован.

...