System.text.json не десериализует ienumerable с частным получателемC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 System.text.json не десериализует ienumerable с частным получателем

Сообщение Anonymous »

Я десериализация серии объектов из стороннего источника. Есть ряд разных форматов, но как только я их покинул, я хочу, чтобы у всех они были общий интерфейс. Так что у меня есть мой общий интерфейс ibusinessevent . Один из моих конкретных классов называется ukbusinessevent < /p>
internal class UkBusinessEvent : IBusinessEvent {
public BusinessEventType EventType { private get; set; }
public DateTime EventDate { private get; set; }
public IEnumerable
People { private get; set; }
public DateTime Date => EventDate;
public string Description => EventType.Description;
public IEnumerable Names => People.Select(p => p.Name);
}
< /code>
EventType, EventDate и People соответствует структуре входящего JSON, но они используются только для десеризации. Я не хочу, чтобы кто -нибудь получал доступ к данным через эти свойства, поэтому я дал им частные добычи. Date , description и имена Реализуйте интерфейс, и они только для чтения.public IEnumerable People { get; set; }
< /code>
Then People заполнен, и код работает.
Почему Getter должен быть публичным, чтобы это работало? EventType и eventDate работать нормально с частными геттерами.using System.Text.Json;

namespace ConsoleApp10 {
internal class Program {
static void Main(string[] args) {
string json = @"[
{
""eventType"": {
""code"": ""A"",
""description"": ""Type A Event""
},
""eventDate"": ""2011-05-10T00:00:00Z"",
""people"": [
{
""name"": ""Jane Jones"",
""role"": ""Accountant""
},
{
""name"": ""Jack Smith"",
""role"": ""Auditor""
}
]
},
{
""eventType"": {
""code"": ""B"",
""description"": ""Type B Event""
},
""eventDate"": ""2009-01-05T00:00:00Z"",
""people"": [
{
""name"": ""William James"",
""role"": ""Manager""
},
{
""name"": ""Sally Wilson"",
""role"": ""Accountant""
}
]
}
]";

List businessEvents = JsonSerializer.Deserialize(json, JsonSerializerOptions.Web);
foreach(IBusinessEvent businessEvent in businessEvents){
Console.WriteLine(businessEvent.Description);
Console.WriteLine(businessEvent.Date);
foreach(string name in businessEvent.Names) {
Console.WriteLine(name);
}
}
}
}

internal interface IBusinessEvent {
DateTime Date { get; }
string Description { get; }
IEnumerable Names { get; }
}

internal class UkBusinessEvent : IBusinessEvent {
public BusinessEventType EventType { private get; set; }
public DateTime EventDate { private get; set; }
public IEnumerable People { private get; set; }
public DateTime Date => EventDate;
public string Description => EventType.Description;
public IEnumerable Names => People.Select(p => p.Name);
}

internal class BusinessEventType {
public string Code { get; set; }
public string Description { get; set; }
}

internal class Person {
public string Name { get; set; }
}
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... ate-getter
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»