Я создаю минимальный веб-API ASP.NET Core. Одна из моих конечных точек должна вернуть данные, содержащиеся в JObject. Этот JObject представляет собой сложную вложенную структуру данных. Я обнаружил, что ответ от этой конечной точки теряет все вложенные данные из JObject.
Из прочитанного я подозреваю, что это вызвано тем, что по умолчанию .NET Core использует свои собственные библиотеки Json для сериализации, а JObect — это класс Newtonsoft, но до сих пор я не обнаружил, как лучше всего справиться с этим.
Например, JObject, с которым я правильно работаю, содержит все ожидаемые данные «ключ-значение». Некоторые значения сами содержат вложенные данные.
Если я запущу .ToString()
, это будет выглядеть так:
{
"key": "stringValue",
"key": "stringValue",
"key": "stringValue",
"key": {
"nestedKey": "nestedValue",
"nestedKey": "nestedValue"
},
"key": "stringValue",
"key": "stringValue"
..
}
Проблема в том, что когда я возвращаю JObject следующим образом:
JObject result = service.ParseToJObject(request.Message);
return TypedResults.Ok(result);
Объект ответа выглядит так — все вложенные значения потеряны.
{
"key1": [],
"key2": [],
"key2": [],
...
}
Я могу решить эту проблему с помощью следующего изменения (преобразование JObject в строку), но хочу знать, есть ли лучший способ исправить это на глобальном уровне. Благодаря этому изменению возвращаемый объект правильно содержит все пары ключ-значение.
string result = service.ParseToJObject(request.Message).ToString();
return TypedResults.Content(result, "application/json");
Я пробовал различные предложения в сети по настройке параметров сериализации Json в сборщике (один пример ниже), но ни одно из них не повлияло на возвращаемые данные.
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;
options.SerializerOptions.PropertyNameCaseInsensitive = true;
options.SerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
options.SerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
Спасибо
Я несколько расширил вопрос, дайте мне знать, если это все еще неясно. Операция service.ParseToObject() не должна иметь никакого значения, за исключением того факта, что она возвращает JObject, который содержит пары ключ-значение. Сам JObject не подлежит сомнению — если я просматриваю его в отладчике или печатаю на консоли, он правильный (его структуру я описываю выше). Проблема в том, что я хочу вернуть этот JObject вызывающему API, но это приводит к потере вложенных данных.
еще больше причин вынести все неактуальное... а что звонилка? другая программа на сервере? Фреймворк TypeScript в браузере? Подумайте, какие вопросы задаст человек, незнакомый с вашим кодом.
Если по какой-либо причине вам необходимо использовать JObject
с System.Text.Json, см. Как я могу сериализовать Newtonsoft JToken в JSON с помощью System.Text.Json? для конвертера. Хотя лучше переключиться на JsonNode
.
Идиоматический способ здесь — просто переключиться с использования JObject
. Минимальные API не работают с Json.NET от Newtonsoft, они работают только с System.Text.Json
, и это не настраивается, и System.Text.Json
ничего не знает о JObject
.
Здесь у вас есть несколько вариантов:
System.Text.Json
, который предоставляет аналогичные возможности.System.Text.Json
, который будет правильно обрабатывать JObject
.Спасибо. Рассмотрю возможность перехода на JsonNode.
что это
service.ParseToJObject()
? Это функция, которую вы написали? Можете ли вы представить, что в нем есть ошибка? Не могли бы вы переписать свой вопрос, чтобы быть более конкретным. Входные данные; код; результат и то, каким вы ожидаете результат. Не оставляйте ничего для воображения, но оставляйте ненужную информацию (например, тот факт, что вы разрабатываете минимальные API, скорее всего, не будет иметь значения). Удачи