Значения ответа JObject не полностью заполнены в возвращенном JSON

Выходной сигнал ответа от содержимого JObject в приложении сформирован неправильно.

Сужая проблему до минимально возможного размера, должны быть некоторые недостающие детали, которые вызывают такое поведение (очень маловероятно, что это другая причина).

В следующем коде показано, что полезная нагрузка JSON является ответом от конечной точки API:

    [HttpPost]
    public async Task<ObjectResult> Post()
    {
      var json = JsonConvert.DeserializeObject<JObject>(
        @"{""parameter-1"":""J234546ZrVl"",""value-2"":""3E9CY3gertertmdALWMmHkvP"",""test-3"":""verify please""}");
      var result = new ObjectResult(json);

      return result;
    }

Ответ получен как:

  {"parameter-1":[],"value-2":[],"test-3":[]}

И должно быть:

  {"parameter-1":"J234546ZrVl","value-2":"3E9CY3gertertmdALWMmHkvP","test-3":"verify please"}

При отладке переменная json верна и имеет все значения свойств, но почему-то не отображается правильно.

Любые идеи?

  • Используется: ASP Net Core 5.0
  • ObjectResult определяется в: namespace Microsoft.AspNetCore.Mvc
  • Его конструктор: public ObjectResult(object value);
  • И имеет интерфейсы:

public class ObjectResult : ActionResult, IStatusCodeActionResult, IActionResult


person TrustworthySystems    schedule 03.06.2021    source источник
comment
Расскажите, пожалуйста, подробнее - какие именно серверные технологии (включая версии) вы используете? Как вы настроили сериализацию? Идеальным вариантом был бы минимальный воспроизводимый пример.   -  person Jon Skeet    schedule 03.06.2021
comment
Скорее всего, ObjectResult не понимает динамическую обработку в JObject.   -  person Lasse V. Karlsen    schedule 03.06.2021
comment
Скорее всего, вы используете asp.net-core 3.0 или новее, который по умолчанию использует System.Text.Json вместо Json.NET. Ваши симптомы аналогичны симптомам из Как я могу сериализовать Newtonsoft JToken в JSON с помощью System.Text.Json?. Чтобы вернуться к Json.NET, см. Где IMvcBuilder AddJsonOptions ушел в .Net Core 3.0?. Если проблема не в этом, пожалуйста, предоставьте более подробную информацию о том, как воспроизвести проблему, включая версии фреймворка и библиотеки, которые вы используете.   -  person dbc    schedule 03.06.2021
comment
каково содержимое ObjectResult? Зачем тебе это? вы можете вернуть json или DeserializeObject непосредственно в ObjectResult. пожалуйста, добавьте к вопросу класс ObjectResult.   -  person Yair I    schedule 03.06.2021
comment
Причина использования ObjectResult заключается в возможности обрабатывать возвращенные полезные данные и ответ кода состояния HTTP в одной переменной в разных методах.   -  person TrustworthySystems    schedule 03.06.2021
comment
Если вы используете asp.net-core-5, проще всего заменить JObject на _ 2_, т.е. var json = System.Text.Json.JsonSerializer.Deserialize<JsonElement>(jsonString);. См. Эквивалент JObject в System.Text.Json.   -  person dbc    schedule 03.06.2021
comment
Можно ли закрыть ваш вопрос как дубликат любого из вопросов, указанных выше, или вам нужна более конкретная помощь? Или ни один из связанных вопросов не решил вашу проблему?   -  person dbc    schedule 04.06.2021


Ответы (1)


Благодаря советам dbc мы можем использовать устаревшие службы, просто сериализуя их возвращаемое значение с предыдущим Newtonsoft.Json и десериализацию с помощью нового System.Text.Json.

Этот метод может помочь и может использоваться во всем приложении, вероятно, для действительно больших значений JSON не является оптимальным, но он понятен и скуден для наших требований.

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Text.Json;

...

  public static JsonDocument JToken2JsonDocument(JToken input)
  {
    var jsonString = JsonConvert.SerializeObject(input);
    var json = JsonDocument.Parse(jsonString);
    return json;
  }

Конструктор ObjectResult можно вызвать с возвращенным объектом и правильно отобразить.

person TrustworthySystems    schedule 05.06.2021
comment
_1 _ * реализует IDisposable. Неспособность правильно удалить этот объект приведет к тому, что память не будет возвращена в пул, что увеличит влияние сборки мусора на различные части платформы. Лучше клонировать _ 3_, удалите документ и верните клон. - person dbc; 06.06.2021