Почему я не могу получить доступ к этому свойству Dynami c из десериализованного Newtonsoft json - PullRequest
0 голосов
/ 09 июля 2020

Я отправляю объект из одного микросервиса в другой, поэтому сериализовал объект, содержащий это свойство

public class Template 
{
    public int Id { get; set; }
    public string FileFormat { get; set; }
}

Я не хочу моделировать TemplateDTO в другом микросервисе, который получает это сообщение поскольку мне нужно получить доступ только к одному из свойств шаблона. Кроме того, мне понадобится Id позже, когда я отправлю его в другой микросервис, поэтому он мне нужен, иначе я мог бы просто отправить одну строку prop. Это свойство в моем DTO:

public dynamic Template { get; set; }

Десериализация работает, но мне кажется, что

templateObj.FileFormat;   //templateObj is equal to reportJson.Template

Вот как объект выглядит при отладке:

Я получаю эту ошибку при попытке доступа к чему-либо из объекта:

ошибка CS1061: 'объект' не содержит определения для 'FileFormat' и нет доступного расширения Метод 'FileFormat', принимающий первый аргумент типа 'object', может быть найден (вам не хватает директивы using или ссылки на сборку?)

Что мне здесь не хватает?

РЕДАКТИРОВАТЬ

Сериализованный объект имеет несколько свойств, одно из которых - Шаблон. Когда я десериализую его в другом микросервисе:

var reportJson = JsonConvert.DeserializeObject<ReportDTO>(serializedMessage);

, я получаю вышеуказанные проблемы.

ReportDTO выглядит так:

public class ReportDTO
{
    public dynamic Template { get; set; }

    ... 
}

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

Я разобрался. Оказывается, когда я десериализую его через

JsonConvert.DeserializeObject<T>(serializedObj);

Поскольку шаблон является динамическим c, он автоматически преобразуется в JObject, поэтому мне нужно использовать что-то вроде этого, чтобы получить значение:

(string)((JObject)templateObj)["FileFormat"]

Вывод: «PDF»

0 голосов
/ 09 июля 2020

Если у вас есть эти классы:

public class Report
{
    public Template Template { get; set; }
}

public class Template
{
    public int Id { get; set; }
    public string FileFormat { get; set; }
}

public class ReportDto
{
    public dynamic Template { get; set; }
}

Затем вы должны сериализовать и десериализовать следующим образом:

        var report = new Report
        {
            Template = new Template { Id = 5, FileFormat = "PDF" }
        };
        var serializedReport = JsonConvert.SerializeObject(report);

        var deserializedReport = JsonConvert.DeserializeObject<ReportDto>(serializedReport);
        Console.WriteLine(deserializedReport.Template.FileFormat); // Output : PDF

Ваша ошибка состоит в том, что вы используете deserializedReport.FileFormat вместо deserializedReport.Template. FileFormat

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...