Преобразование ответа JSON в пользовательский объект C#

Я звоню в веб-службу и получаю следующие ответы Json

{"handler":{"name":"abc"},"intent":{"name":"actions.intent.MAIN","params":{},"query":"Mit Google sprechen"},"scene":{"name":"actions.scene.START_CONVERSATION","slotFillingStatus":"UNSPECIFIED","slots":{},"next":{"name":"Start_Frage"}},"session":{"id":"ABwppHHVumDrliLJaLSikS6KnIlN7yYv6Z4XJCOYzEZt8Fr08RH6r0wtM2-E0v40lS2p1YosTDfpSCd5Lw","params":{},"typeOverrides":[],"languageCode":""},"user":{"locale":"de-DE","params":{},"accountLinkingStatus":"ACCOUNT_LINKING_STATUS_UNSPECIFIED","verificationStatus":"VERIFIED","packageEntitlements":[],"gaiamint":"","permissions":[],"lastSeenTime":"2021-04-01T10:06:59Z"},"home":{"params":{}},"device":{"capabilities":["SPEECH","RICH_RESPONSE","LONG_FORM_AUDIO"]}}

Я использовал https://json2csharp.com/ для преобразования моей строки Json в классы C#

 public class Handler
    {
        public string name { get; set; }
    }

    public class Params
    {
    }

    public class Intent
    {
        public string name { get; set; }
        public Params @params { get; set; }
        public string query { get; set; }
    }

    public class Slots
    {
    }

    public class Next
    {
        public string name { get; set; }
    }

    public class Scene
    {
        public string name { get; set; }
        public string slotFillingStatus { get; set; }
        public Slots slots { get; set; }
        public Next next { get; set; }
    }

    public class Session
    {
        public string id { get; set; }
        public Params @params { get; set; }
        public List<object> typeOverrides { get; set; }
        public string languageCode { get; set; }
    }

    public class User
    {
        public string locale { get; set; }
        public Params @params { get; set; }
        public string accountLinkingStatus { get; set; }
        public string verificationStatus { get; set; }
        public List<object> packageEntitlements { get; set; }
        public string gaiamint { get; set; }
        public List<object> permissions { get; set; }
        public DateTime lastSeenTime { get; set; }
    }

    public class Home
    {
        public Params @params { get; set; }
    }

    public class Device
    {
        public List<string> capabilities { get; set; }
    }

    public class Root
    {
        public Handler handler { get; set; }
        public Intent intent { get; set; }
        public Scene scene { get; set; }
        public Session session { get; set; }
        public User user { get; set; }
        public Home home { get; set; }
        public Device device { get; set; }
    }

Но как именно мне преобразовать мой ответ Json в объект C#? Затем внести в него какие-либо изменения и, наконец, отправить ответ? Я новичок в программировании, поэтому пример Step by Step был бы очень полезен

Мой текущий класс выглядит так. Тело переменной содержит ответ Json.

public class GoogleController : ControllerBase
    {

        [HttpGet]
        public IActionResult Get()
        {
            var result = new Result();
            result.Value1 = 123;

            return Ok(result);
        }
        [HttpPost]
        public async Task<IActionResult> PostWebHook()
        {

            string body;
            using (var reader = new StreamReader(Request.Body))
            {
                body = await reader.ReadToEndAsync();

            }
            return Ok("Test123");
                
        }
    }

Как насчет использования JsonConvert.DeserializeObject?

Uwe Keim 06.04.2021 11:51

Вам не нужно явно десериализовать содержимое запроса. Если действие принимает объект, соответствующий телу JSON, ASP.NET автоматически десериализует его.

Panagiotis Kanavos 06.04.2021 12:02

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

DavidG 06.04.2021 12:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
3
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

https://json2csharp.com/ добавляет в первую строку команду, например:

Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 

Эта строка используется для десериализации текста.

Ваш должен быть таким:

var myDeserializedClass = JsonConvert.DeserializeObject<Root>(body);

Это очень ручная работа, основанная на использовании JSON.Net. Вместо этого просто позвольте структуре сделать это за вас, как показывает другой ответ.

DavidG 06.04.2021 12:01

@DavidG, ты прав, ответ лучше

Connor Stoop 06.04.2021 12:09
Ответ принят как подходящий

Используйте атрибут FromBody для десериализации тела

    [HttpPost]
    public async Task<IActionResult> PostWebHook([FromBody] Root root)
    {
        // root is deserialized body
        // modify root
        ...
        return Ok(root);
    }

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