Как мне вернуть JObject из минимального веб-API ASP.NET Core, сохраняя при этом вложенные элементы?

Я создаю минимальный веб-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.ParseToJObject()? Это функция, которую вы написали? Можете ли вы представить, что в нем есть ошибка? Не могли бы вы переписать свой вопрос, чтобы быть более конкретным. Входные данные; код; результат и то, каким вы ожидаете результат. Не оставляйте ничего для воображения, но оставляйте ненужную информацию (например, тот факт, что вы разрабатываете минимальные API, скорее всего, не будет иметь значения). Удачи

Felix 10.07.2024 02:53

Я несколько расширил вопрос, дайте мне знать, если это все еще неясно. Операция service.ParseToObject() не должна иметь никакого значения, за исключением того факта, что она возвращает JObject, который содержит пары ключ-значение. Сам JObject не подлежит сомнению — если я просматриваю его в отладчике или печатаю на консоли, он правильный (его структуру я описываю выше). Проблема в том, что я хочу вернуть этот JObject вызывающему API, но это приводит к потере вложенных данных.

ki81 10.07.2024 03:36

еще больше причин вынести все неактуальное... а что звонилка? другая программа на сервере? Фреймворк TypeScript в браузере? Подумайте, какие вопросы задаст человек, незнакомый с вашим кодом.

Felix 10.07.2024 06:58

Если по какой-либо причине вам необходимо использовать JObject с System.Text.Json, см. Как я могу сериализовать Newtonsoft JToken в JSON с помощью System.Text.Json? для конвертера. Хотя лучше переключиться на JsonNode.

dbc 11.07.2024 00:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Идиоматический способ здесь — просто переключиться с использования JObject. Минимальные API не работают с Json.NET от Newtonsoft, они работают только с System.Text.Json, и это не настраивается, и System.Text.Json ничего не знает о JObject.

Здесь у вас есть несколько вариантов:

  1. Переключитесь на JsonNode API, предоставляемый System.Text.Json, который предоставляет аналогичные возможности.
  2. Напишите/найдите собственный сериализатор для System.Text.Json, который будет правильно обрабатывать JObject.
  3. Немного потрудитесь, пытаясь втиснуть Json.NET в минимальные API — см. Как настроить NewtonsoftJson с минимальным API в .NET 6.0

Спасибо. Рассмотрю возможность перехода на JsonNode.

ki81 11.07.2024 02:12

Другие вопросы по теме